

MQL4インジケーターのサインが1分から5分に変えてまた1分に戻した時に  
サインが消えてる場合があります。  
ソースコードで自分なりにリペイントしないようにしたつもりなのですが  
リペイントします。

ソースコードでどこを変更すればリペイントしないようになりますか？  
よろしくお願いします。

[code]

    bool Gi_100 = FALSE;
    bool Gi_104 = FALSE;
    bool Gi_108 = FALSE;
    bool Gi_112 = FALSE;
    int Gi_116 = 0;
    bool Gi_120 = FALSE;
    bool Gi_124 = FALSE;
    
    // E37F0136AA3FFAF149B351F6A4C948E9
    int init() {
    SetIndexStyle(0, DRAW_ARROW, EMPTY, 1);
    SetIndexArrow(0, 241);
    SetIndexBuffer(0, G_ibuf_76); 
    SetIndexStyle(1, DRAW_ARROW, EMPTY, 1);
    SetIndexArrow(1, 242);
    SetIndexBuffer(1, G_ibuf_80); 
    return (0);
    }
    
    // 52D46093050F38C27267BCE42543EF60
    int deinit() {
    return (0);
    }
    
    // EA2B2676C28C0DB26D39331A336C6B92
    int start() {
    int Li_8;
    double ima_12;
    double ima_20;
    double ima_28;
    double ima_36;
    double ima_44;
    double ima_52;
    double irsi_60;
    double irsi_68;
    double irsi_76;
    double Ld_84;
    double Ld_92;
    int Li_100 = IndicatorCounted();
    if (Li_100 < 0) return (-1);
    if (Li_100 > 0) Li_100--;
    int Li_0 = Bars - Li_100;
    for (int Li_4 = 0; Li_4 <= Li_0; Li_4++) {
    Li_8 = Li_4;
    Ld_84 = 0;
    Ld_92 = 0;
    for (Li_8 = Li_4; Li_8 <= Li_4 + 9; Li_8++) Ld_92 += MathAbs(High[Li_8] - Low[Li_8]);
    Ld_84 = Ld_92 / 10.0;
    ima_12 = iMA(NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, Li_4);
    ima_28 = iMA(NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, Li_4 + 1);
    ima_44 = iMA(NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, Li_4 - 1);
    ima_20 = iMA(NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_CLOSE, Li_4);
    ima_36 = iMA(NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_CLOSE, Li_4 + 1);
    ima_52 = iMA(NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_CLOSE, Li_4 - 1);
    irsi_60 = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, Li_4);
    irsi_68 = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, Li_4 + 1);
    irsi_76 = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, Li_4 - 1);
    if (irsi_60 > 45.0 && irsi_68 < 45.0 && irsi_76 > 45.0) {
    Gi_104 = TRUE;
    Gi_112 = FALSE;
    }
    if (irsi_60 < 55.0 && irsi_68 > 55.0 && irsi_76 < 55.0) {
    Gi_104 = FALSE;
    Gi_112 = TRUE;
    }
    if (ima_12 > ima_20 && ima_28 < ima_36 && ima_44 > ima_52) {
    Gi_100 = TRUE;
    Gi_108 = FALSE;
    }
    if (ima_12 < ima_20 && ima_28 > ima_36 && ima_44 < ima_52) {
    Gi_100 = FALSE;
    Gi_108 = TRUE;
    }
    if (Gi_100 == TRUE && Gi_104 == TRUE && Gi_116 != 1) {
    G_ibuf_76[Li_4] = Low[Li_4] - 0.8 * Ld_84;
    if (Li_4 <= 2 && Alerts && (!Gi_120)) {
    Alert(Symbol(), " ", Period(), " Signal:BUY! ");
    PlaySound(Symbol()+".wav");
    Gi_120 = TRUE;
    Gi_124 = FALSE;
    }
    Gi_116 = 1;
    } else {
    if (Gi_108 == TRUE && Gi_112 == TRUE && Gi_116 != 2) {
    G_ibuf_80[Li_4] = High[Li_4] + 0.8 * Ld_84;
    if (Li_4 <= 2 && Alerts && (!Gi_124)) {
    Alert(Symbol(), " ", Period(), " Signal:SELL! ");
    PlaySound(Symbol()+".wav");
    Gi_124 = TRUE;
    Gi_120 = FALSE;
    }
    Gi_116 = 2;
    }
    }
    }
    return (0);
    }
    
[/code]


CC BY-SA 4.0
2018-08-11T11:29:57.877
47449
2022-04-30T14:04:50.157
2022-04-30T14:04:50.157
19110
29696
question
mql4
MQL4インジケーターのサインがリペイントしないようにしたい


ざっと見た感じ、下記の部分が気になったので修正してみました。  
1. IndicatorCounted()が0または1を返したときに、Li_0がBarsになるため、Li_4が範囲外になる。  
2. Li_8がBars以上になり、範囲外になる。
[code]

    for (int Li_4 = 0; Li_4 < Li_0; Li_4++) {
    Li_8 = Li_4;
    Ld_84 = 0;
    Ld_92 = 0;
    for (Li_8 = Li_4; Li_8 <= Li_4 + 9; Li_8++) { if (Li_8 < Bars) { Ld_92 += MathAbs(High[Li_8] - Low[Li_8]); } }
    
[/code]

追記:毎回全部計算するようにして、無理やりリペイントしないように改造してみました。  
ただし、  
<http://d.hatena.ne.jp/fai_fx/20100324/1269363902>  
にも書かれているように、あまり意味はないと思います。

[code]

    bool Gi_120 = FALSE;
    bool Gi_124 = FALSE;
    
    // E37F0136AA3FFAF149B351F6A4C948E9
    int init() {
    SetIndexStyle(0, DRAW_ARROW, EMPTY, 1);
    SetIndexArrow(0, 241);
    SetIndexBuffer(0, G_ibuf_76);
    SetIndexEmptyValue(0,0); 
    SetIndexStyle(1, DRAW_ARROW, EMPTY, 1);
    SetIndexArrow(1, 242);
    SetIndexBuffer(1, G_ibuf_80);
    SetIndexEmptyValue(1,0); 
    return (0);
    }
    
    // 52D46093050F38C27267BCE42543EF60
    int deinit() {
    return (0);
    }
    
    // EA2B2676C28C0DB26D39331A336C6B92
    int start() {
    int Li_8;
    double ima_12;
    double ima_20;
    double ima_28;
    double ima_36;
    double ima_44;
    double ima_52;
    double irsi_60;
    double irsi_68;
    double irsi_76;
    double Ld_84;
    double Ld_92;
    bool Gi_100 = FALSE;
    bool Gi_104 = FALSE;
    bool Gi_108 = FALSE;
    bool Gi_112 = FALSE;
    int Gi_116 = 0;
    //int Li_100 = IndicatorCounted();
    int Li_100 = 0;
    if (Li_100 < 0) return (-1);
    if (Li_100 > 0) Li_100--;
    int Li_0 = Bars - Li_100;
    //for (int Li_4 = 0; Li_4 < Li_0; Li_4++) {
    for (int Li_4 = Li_0 - 1; Li_4 >= 0; Li_4--) {
    Li_8 = Li_4;
    Ld_84 = 0;
    Ld_92 = 0;
    G_ibuf_76[Li_4] = 0;
    G_ibuf_80[Li_4] = 0;
    for (Li_8 = Li_4; Li_8 <= Li_4 + 9; Li_8++) { if (Li_8 < Bars) { Ld_92 += MathAbs(High[Li_8] - Low[Li_8]); } }
    Ld_84 = Ld_92 / 10.0;
    ima_12 = iMA(NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, Li_4 + 1);
    ima_28 = iMA(NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, Li_4 + 2);
    ima_44 = iMA(NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, Li_4 + 0);
    ima_20 = iMA(NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_CLOSE, Li_4 + 1);
    ima_36 = iMA(NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_CLOSE, Li_4 + 2);
    ima_52 = iMA(NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_CLOSE, Li_4 + 0);
    irsi_60 = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, Li_4 + 1);
    irsi_68 = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, Li_4 + 2);
    irsi_76 = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, Li_4 + 0);
    if (irsi_60 > 45.0 && irsi_68 < 45.0 && irsi_76 > 45.0) {
    Gi_104 = TRUE;
    Gi_112 = FALSE;
    }
    if (irsi_60 < 55.0 && irsi_68 > 55.0 && irsi_76 < 55.0) {
    Gi_104 = FALSE;
    Gi_112 = TRUE;
    }
    if (ima_12 > ima_20 && ima_28 < ima_36 && ima_44 > ima_52) {
    Gi_100 = TRUE;
    Gi_108 = FALSE;
    }
    if (ima_12 < ima_20 && ima_28 > ima_36 && ima_44 < ima_52) {
    Gi_100 = FALSE;
    Gi_108 = TRUE;
    }
    if (Gi_100 == TRUE && Gi_104 == TRUE && Gi_116 != 1) {
    G_ibuf_76[Li_4] = Low[Li_4] - 0.8 * Ld_84;
    if (Li_4 <= 2 && Alerts && (!Gi_120)) {
    Alert(Symbol(), " ", Period(), " Signal:BUY! ");
    PlaySound(Symbol()+".wav");
    Gi_120 = TRUE;
    Gi_124 = FALSE;
    }
    Gi_116 = 1;
    } else {
    if (Gi_108 == TRUE && Gi_112 == TRUE && Gi_116 != 2) {
    G_ibuf_80[Li_4] = High[Li_4] + 0.8 * Ld_84;
    if (Li_4 <= 2 && Alerts && (!Gi_124)) {
    Alert(Symbol(), " ", Period(), " Signal:SELL! ");
    PlaySound(Symbol()+".wav");
    Gi_124 = TRUE;
    Gi_120 = FALSE;
    }
    Gi_116 = 2;
    }
    }
    }
    return (0);
    }
    
[/code]


CC BY-SA 4.0
2018-08-18T12:47:57.923
47607
2018-08-22T13:56:27.017
2018-08-22T13:56:27.017
539
539
47449
answer