[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 326

 

私はインジケータに詳しくないのですが、ひとつだけ確認することにしました。エキスパートアドバイザーは、上側のRSI インジケータの価格で買い、下側のインジケータの価格で売る必要があります。価格はすでにRSI 指標の上限を超えて いる場合にのみ、購入は、この境界の上に、この境界の値+上方境界からインデントのいくつかの値(コードで私はちょうど数字0.1を 指定)、逆に販売のための下にする必要があります。

こんな感じでやりました。

外部パラメータ。

extern string ___H1 = " __________ Параметры RSI _________ ";
extern int     i_RSITF = 5,
               i_RSIPeriod = 21,
               i_RSIApplied = PRICE_CLOSE;
extern double  i_RSIToUpLimit = 55,                                     // Верхняя граница RSI
               i_RSIToDnLimit = 45;                                     // Нижняя граница RSI

シグナルを受信する関数のコードとRSI値そのもの: ここでいう0.1とは、買いまたは売りの範囲に対するマージンの許容範囲)

//+-------------------------------------------------------------------------------------+
//| Получаем RSI с заданными параметрами                                                |
//+-------------------------------------------------------------------------------------+
double GetRSI(int RSIIndex)
{
   return (iRSI(NULL, i_RSITF, i_RSIPeriod, i_RSIApplied, RSIIndex));
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   if (FindOrders() > 0)
       return (SIGNAL_NO);

 //  if (GetRSI(PRICE_CLOSE, 0) > GetRSI(PRICE_CLOSE, 1))
   if (GetRSI(0) > i_RSIToUpLimit)
      if (GetRSI(0) < (i_RSIToUpLimit + 0.1))
         return (SIGNAL_BUY);                  // Запускаем функцию открытия покупки
           
   if (GetRSI(0) < i_RSIToDnLimit)
      if (GetRSI(0) > (i_RSIToDnLimit - 0.1))
         return (SIGNAL_SELL);                // Запускаем функцию открытия продаж
   
   return (SIGNAL_NO);
}

EAが非常に高い位置から注文を出すこともあれば、もっと高い位置から(買いの場合)、もっと低い位置から(売りの場合)注文を出すこともあります。なぜ?アルゴリズムは初歩的なものです。

 
皆さん、こんにちは。質問があります。私はコピー機 /**/ を手に入れました。しかし、問題は、他のプログラム(ビデオ、ゲーム、単なる地図)を並行して実行すると、スピーカーから常にパチパチと音がすることです。問題(ガタツキ)を解消することは可能ですか?ありがとうございました。
 

私はRSI(アナログはRandomIndicatorSignals mq4)をベースにしたシンプルなインジケータを書こうとしています。

私はRSIをベースにしたシンプルなインジケータを書こうとしています(記事MQL4 Language for DummiesのRandomIndicatorSignals.mq4このインジケータのアナログ用。カスタムインディケーター(その1)(https://www.mql5.com/ru/articles/1500)

考え方は簡単で、RSIがトップやトラフを描いたら、チャート上に矢印を描きます。

一見問題なさそうですが、私見では各ローソク足のRSI値バッファが満たされておらず、そのため動作しないようです。以下はそのコードです。

//+------------------------------------------------------------------+
//|                                                    RSI+Arrow.mq4 |
//|                                                         _______ |
//|                                                    |
//+------------------------------------------------------------------+
#property copyright "_______"
#property link      "_________"


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Crimson
#property indicator_color2 RoyalBlue
//---- input parameters
extern int       barsToProcess=500;
//---- buffers
double ExtMapBuffer1[],
       ExtMapBuffer2[],
       RSIBuffer3[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,236);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,238);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   SetIndexBuffer (2,RSIBuffer3);
   // для информации о значениях буфера
   SetIndexLabel  (2,"RSIBuffer3");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {    
   //расчет индикатора на последних барах 
   int limit,i;
   int counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   if(limit>barsToProcess)
   limit=barsToProcess;
   
   //заполняем буфер RSI значениями 
   for(i=0; i<limit; i++)
   if(i>=1)
     {
       RSIBuffer3[i]=iRSI(0,0,8,PRICE_CLOSE,0);
     }       
  //проводим сравнения                        
   for(i=0; i<limit; i++)
   if(i>=1)
        
        {
        if(RSIBuffer3[i+2]-RSIBuffer3[i+1]>0 && RSIBuffer3[i+1]-RSIBuffer3[i]>0) // условия выставления стрелки 

        /* так тоже не работает
        if(RSIBuffer3[i+2]>=RSIBuffer3[i+1] && RSIBuffer3[i+1]<=RSIBuffer3[i])
        */
        
        ExtMapBuffer2[i]=Low[i]-5*Point;
                    
        else
           
        ExtMapBuffer2[i]=0.0;
               
        if(RSIBuffer3[i+2]-RSIBuffer3[i+1]<0 && RSIBuffer3[i+1]-RSIBuffer3[i]<0) // условия выставления стрелки
        
        /* так тоже не работает
        if(RSIBuffer3[i+2]<=RSIBuffer3[i+1] && RSIBuffer3[i+1]>=RSIBuffer3[i])
        */
              
        ExtMapBuffer1[i]=High[i]+5*Point;
           
        else      
           
        ExtMapBuffer1[i]=0.0;           
        }
                   
   return(0);
   }
        
//+------------------------------------------------------------------+      
 
Merincool:

私はRSI(アナログはRandomIndicatorSignals mq4)をベースにしたシンプルなインジケータを書こうとしています。

私はRSIをベースにしたシンプルなインジケータを書こうとしています(記事MQL4 Language for DummiesのRandomIndicatorSignals.mq4このインジケータのアナログ用。カスタムインディケーター(その1)(https://www.mql5.com/ru/articles/1500)

考え方は簡単で、RSIがトップやトラフを描いたら、チャート上に矢印を描きます。

一見問題なさそうですが、私見では各ローソク足のRSI値バッファが満たされておらず、そのため動作しないようです。以下はそのコードです。

ループ内で未計算のインジケータ値にアクセスしている。

変更

for(i=0; i<limit; i++)

まで

for(i=limit-1; i>=0; i--)
 
PapaYozh:

計算されていない指標値に循環的に戻っています。

変更

まで


ありがとうございます!アイデアが浮かびました。しかし、物理学者がよく言っていたように、私は「物理的な意味」を理解したいのです。

2つの "わずかに "異なる、しかし本質的には同じアクションコードという問題があります。全保留注文の 削除

1) 正常に動作しない - 1つの注文だけが削除される

void start()

  {

   bool   result;     int    cmd,total,OT;

   total=OrdersTotal();

   for(int i=0; i<total; i++)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

        {

         cmd=OrderType();    OT=OrderTicket();

         if(cmd>1)   // !=OP_BUY && cmd!=OP_SELL)

           {

            result=OrderDelete(OT);

           }

        }

     } //end FOR

  }

2) 問題なく動作する - すべてを削除する

void start()
{
    string msg="Удалить все отложенные ордера?    ";
//   if (MessageBox(msg,title,MB_YESNO|MB_ICONQUESTION)!=IDYES) return;

   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if (OrderType()>1) OrderDelete(OrderTicket());
   }
}

このループでは、インジケータの未計算の値にアクセス する」の意味について、説明してください。

 
PapaYozh:

計算されていない指標値に循環的に戻っています。

変更

まで


どうしてですか?
 
PapaYozh:

計算されていない指標値に循環的に戻っています。

変更

まで


RSIBuffer3は、バー上にカーソルを置くと、最後のバーのRSI値のみを表示するため、まだ機能していない
 
Merincool:

RSIBuffer3はバーの上にカーソルを置くと、最後のバーのRSI値を表示するだけです。

5番目のパラメータは0、つまり最後の小節です。

はこのようにします。

       RSIBuffer3[i]=iRSI(0,0,8,PRICE_CLOSE,i);  

docより抜粋

doubleiRSI() 文字列 symbol, int timeframe, int period, int applied_price, int shift)
相対強度指数(Relative strength index)を計算し、その値を返す。
パラメータ
記号 - 指標を算出するために使用するデータを表す記号。 NULLは現在のシンボルを意味する。
タイムフレーム - タイムフレームTimeframe列挙 値のいずれかを指定することができる。0は現在のチャートのタイムフレームを意味します。
時期 - 計算のための期間数。
適用価格 - 適用価格です。Appliedprice enumeration の 値のいずれかを指定することができる。
シフト - 指標バッファから取得した値のインデックス(現在のバーから指定された期間分前に相対的にシフト)。
 
PapaYozh:

計算されていない指標値に循環的に戻っています。

変更

まで


そして、私が思ったのは、あなたのロジックによると、ツールはリミットと0バーからRSIを計算するはずですが、RSIを端から計算するか、最初から計算するか、違いはありますか? それは、与えられた範囲内の各バーのRSIを計算して、その値をバッファ(つまり配列)に入れ、そして配列の3つの連続した値を互いに比較するだけでよいのです。それとも違うのでしょうか?

 
amurik61:

5番目のパラメータは0、つまり最後の小節です。

はこのようにします。

docより抜粋

doubleiRSI() 文字列 symbol, int timeframe, int period, int applied_price, int shift)
相対強度指数(Relative strength index)を計算し、その値を返す。
パラメータ
記号 - 指標を算出するために使用するデータを表す記号。 NULLは現在のシンボルを意味する。
タイムフレーム - タイムフレームTimeframe列挙 値のいずれかを指定することができる。0は現在のチャートのタイムフレームを意味します。
時期 - 計算のための期間数。
適用価格 - 適用価格です。Appliedprice enumeration の 値のいずれかを指定する。
シフト - 指標バッファから取得した値のインデックス(現在のバーから指定した時間分前に相対的にシフトする)。

試してみます、ありがとうございました