初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 824

 
lil_lil:

ありがとうございます。アルゴリズムの最初の2点を満たし、最初のバーに2つのMAの値があるとき、2つのMAを交差するバーの数を求めるループはどのように書けばよいのでしょうか?

/

.


嗚呼、結局は配列で解決したわけではないんですね。

注:配列による解決策(指標からFirst[]、Second[]、Third[]配列への最後の3つの値のコピー)は、2つのiMA- OnTick()を交差させる ことです。

//--- We look for crossing of two indicators
   double   First[];
   double   Second[];
   double   Third[];
   ArraySetAsSeries(First,true);    // index [0] - the most right bar on a charts
   ArraySetAsSeries(Second,true);   // index [0] - the most right bar on a charts
   ArraySetAsSeries(Third,true);    // index [0] - the most right bar on a charts
   int      buffer_num=0;           // indicator buffer number 
   int      start_pos=0;            // start position 
   int      count=3;                // amount to copy 
   if(!iMAGet(handle_iMA_First,buffer_num,start_pos,count,First))
      return;
   if(!iMAGet(handle_iMA_Second,buffer_num,start_pos,count,Second))
      return;
   if(InpFilterMA)
      if(!iMAGet(handle_iMA_Third,buffer_num,start_pos,count,Third))
         return;
//--- step 1: check in the arrays bars [0] and [1]
   if(First[0]>Second[0] && First[1]<Second[1]) // buy
     {
      if(InpFilterMA)
         if(Third[0]>=First[0])
            return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
      return;
     }
   else if(First[0]<Second[0] && First[1]>Second[1]) // sell
     {
      if(InpFilterMA)
         if(Third[0]<=First[0])
            return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
      return;
     }
//--- step 2: on a step of 1 crossing haven't found. check in the arrays bars [0] and [2]
   if(First[0]>Second[0] && First[2]<Second[2]) // buy
     {
      //--- search in history
      if(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
         return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
      return;
     }
   else if(First[0]<Second[2] && First[1]>Second[2]) // sell
     {
      //--- search in history
      if(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
         return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
      return;
     }


あなたの場合(一度に1つの値)、ループは次のようになります。

   int      signal=0;                                 // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
   double   MA1_curr=iMAGet(handle_iMA_1,0);          // the value of the 1st MA on i bar
   double   MA2_curr=iMAGet(handle_iMA_2,0);          // the value of the 1st MA on i bar
   for(int i=0;i<100;i++)
     {
      double   MA1_prev=iMAGet(handle_iMA_1,i+1);     // the value of the 1st MA on i+1 th bar
      double   MA2_prev=iMAGet(handle_iMA_2,i+1);     // the value of the 1st MA on i+1 th bar
      //---
      signal=0;                                       // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
      if(MA1_prev<MA2_prev && MA1_curr>MA2_curr)
         signal=1;
      else if(MA1_prev>MA2_prev && MA1_curr<MA2_curr)
         signal=-1;
      //---
      MA1_curr=MA1_prev;
      MA2_curr=MA2_prev;
     }

MA1_curr - インジケータMA1の#iバーの値、MA1_prev - インジケータMA1の#i+1バーの値。
MA2_curr - インジケータMA2のバー#iの値、MA2_prev - インジケータMA2のバー#i+1での値

クロスが発生した場合(変数シグナルが「-1」または「1」)-iの値は、クロスが発生したバーの番号になります。

これはクロスオーバーを見つけるための最も単純なアルゴリズムですが、最も正確なものではありません。

 
Vladimir Karputov:

ああ、やっぱり配列は使わないことにしたのか...。


ありがとうございます、他のMAクロス EAを例として使わせていただきました

クロスした後、3本目か5本目か...n本目のバーでエントリーしたい。

ウラジーミル・カルプトフ

あなたの場合(1つの値を取得する)、サイクルは次のようになります。

クロスオーバーが見つかったときに、ループの出口がないのはなぜですか?

これらの条件をループの外に出すことは可能でしょうか?

 if(signal==-1)num_bar_b=i;
 if(signal==1)num_bar_s=i;

.

 

こんにちは。相場履歴をインポート するために、FinamまたはMFD.ruサーバーから履歴データをダウンロードする形式を教えていただけませんか?全くできません。txtからcsvに保存して終わりなんですけど。

 
Eol:

こんにちは。相場履歴をインポートするために、FinamまたはMFD.ruサーバーから履歴データをダウンロードする形式を教えていただけませんか?全くできません。txtからcsvに保存して終わりなんですけど。


MetaTrader 5では、何もダウンロードする必要はありません :)- トレードサーバーに接続すると、すぐにリアルティックの履歴を確認することができます。CopyTicksに 注目

 
Vladimir Karputov:

MetaTrader 5では、何もダウンロードする必要はありません:)- トレードサーバーに接続すると、すぐにリアルティックの履歴を確認することができます。CopyTicksに 注目


10年分のロシア株があればいいんです。私のブローカーはそこまでしてくれないし、見つけられそうにない。

 
5.0 Build 1755

問題の内容

こんばんは、MQL5について質問があるので、もしよろしければ教えてください。
5の教科書はまだ持っていないんです。
という疑問があります。


#property indicator_level1 30 - パラメータを定義しました。チャート上でインジケータを 読み込むとわかったよ。
関数ColorBuffer[]で、このパラメータより下降した場合、ラインを変更します。

ここで問題が発生しました。インジケータを開き、パラメータを別のものに変更すると、インジケータをロードした後でもレベル線はそこに配置されますが、インジケータは前に設定したパラメータ、すなわち#property indicator_level1 30を使用して計算します。

このレベルを実行時に変更するためには、どのように対処すればよいのでしょうか?

- すでにパラメータを確認しようとした。そして、すべてのインジケーターチェーンを再計算する。
でも、まだ思い通りに再描画してくれないんです!

助けて
:)

操作の流れ

RSI.mqh

#property indicator_level1 30

#property indicator_level2 70


カルキュライトの説明コードに線がForを通るところの最後に、このレベル以下なら線の色を変えるという機能を追加しました。
ExtColorsBuffer [i] =0;
if (ExtRSIBuffer [i]> indicator_level2& indicator_levelcolor!=NULL) {。
ExtColorsBuffer [i] =1;
}
if (ExtRSIBuffer [i]< indicator_level1& indicator_levelcolor!=NULL) {。
ExtColorsBuffer [i] =2;

期待される結果


画像上と同じですが、インジケーターを使う過程で設定を開いてレベルindicator_level1 / 2を変更すると期待通りになります。インジケータは再描画されるので、線がレベルを超えたら色が変わる。でも、私にとっては、以前と同じレベルです :)

詳細はこちら

...

ファイル:
rrgpusgf5g.png  69 kb
 
Ivan Stepanenko:
5.0 Build 1755

問題の内容

こんばんは、MQL5について質問があるので、もしよろしければ教えてください。
5の教科書はまだ持っていないんです。
という疑問があります。


#property indicator_level1 30 - パラメータを定義しました。チャート上でインジケータを 読み込むとわかったよ。
関数ColorBuffer[]で、このパラメータより下降した場合、ラインを変更します。

ここで問題が発生しました。インジケータを開き、パラメータを別のものに変更すると、インジケータをロードした後でもレベル線はそこに配置されますが、インジケータは前に設定したパラメータ、すなわち#property indicator_level1 30を使用して計算します。

このレベルを実行時に変更できるようにするには、どのように対処したらよいでしょうか。

- すでにパラメータを確認しようとした。そして、すべてのインジケーターチェーンを再計算する。
でも、まだ思い通りに再描画してくれないんです!

助けて
:)

操作の流れ

RSI.mqh

#property indicator_level1 30

#property indicator_level2 70


カルキュライトの説明コードに線がForを通るところの最後に、このレベル以下なら線の色を変えるという機能を追加しました。
ExtColorsBuffer [i] =0;
if (ExtRSIBuffer [i]> indicator_level2& indicator_levelcolor!=NULL) {。
ExtColorsBuffer [i] =1;
}
if (ExtRSIBuffer [i]< indicator_level1& indicator_levelcolor!=NULL) {。
ExtColorsBuffer [i] =2;

期待される結果


画像と同じように見えるのですが、インジケーターを使う過程で設定を開いてindicator_level1 / 2を変更すると再描画されます。インジケータは再描画されるので、線がレベルを超えたら - 色が変わるのです。でも、私にとっては、以前と同じレベルです :)

詳細はこちら

...

IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrCrimson);      // Поменяет цвет самого первого по счёту уровня на цвет Crimson
IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrDeepSkyBlue);  // Поменяет цвет второго по счёту уровня на цвет DeepSkyBlue
 
Ivan Stepanenko:
5.0 Build 1755

問題の内容

こんばんは、MQL5について質問があるので、もしよろしければ教えてください。
5の教科書はまだ持っていないんです。
という疑問があります。

回答が気に入らない理由を別トピックで教えてほしいです。

トレーディング、自動売買システム、ストラテジーテストのためのフォーラムです。

MQL5 #property indicator_level のヘルプが必要です。

アレクセイ・ビクトロフ さん 2018.01.31 09:06

イゴール、私たちはどちらも間違っている。すぐに課題が理解できなかった......。

また、#propertyディレクティブの他に、インジケーターのレベルを設定する関数もあります。

IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);

従って、このレベルは受信インジケーターパラメーターで設定する必要がある。この場合、レベルは指定された値で描画されるので、この値で変更する必要があります。

テストケース

#property indicator_separate_window
#property indicator_buffers     1
#property indicator_type1       DRAW_LINE
#property indicator_plots       1
#property indicator_color1      clrGreenYellow
#property indicator_level1      0
#property indicator_levelcolor  clrPurple

input double level = 0.6;
double buf[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, buf, INDICATOR_DATA);
   IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, level);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int i = 0, limit = prev_calculated == 0 ? 0 : rates_total-1;
    for(i = limit; i < rates_total; i++)
     {
      buf[i] = i%2;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

入力パラメーターで定義されたレベルに応じて色を変えるのは難しくないかと思います。
 

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

アレクセイ ロディオノフ さん 2018.02.06 16:31

ここで、面白いものがあります。

Print("Баланс на счёте = ",AccountInfoDouble(ACCOUNT_BALANCE));
printf("ACCOUNT_BALANCE =  %G",AccountInfoDouble(ACCOUNT_BALANCE));


pintfで%Gを削除すると、値は表示されませんが、Printでは%Gなしで表示されます。

また、Printでは残高値10000.0が表示されますが、printfでは整数値10000だけです

PrintとPrintfの違いは何なのか、そして何より%Gがないと表示されないのはなぜなのか、に興味があります。参考書では何もわからなかった。


 

こんにちは同僚、私は質問を持っている、私はフォーラム "外国為替マネー "の署名に私の信号のウィジェットを 挿入しようとしているが、彼らは無効またはブロックされたHTML、それがURLに変換する方法はありますか?

以下はそのコードです。 <iframe frameborder="0" width="220" height="140" src="https://www.mql5.com/ru/signals/widget/signal/328l?t=green"></iframe>

理由: