//--- We look for crossing of two indicatorsdouble First[];
double Second[];
double Third[];
ArraySetAsSeries(First,true); // index [0] - the most right bar on a chartsArraySetAsSeries(Second,true); // index [0] - the most right bar on a chartsArraySetAsSeries(Third,true); // index [0] - the most right bar on a chartsint 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;
}
elseif(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 historyif(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;
}
elseif(First[0]<Second[2] && First[1]>Second[2]) // sell
{
//--- search in historyif(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" -> Buydouble MA1_curr=iMAGet(handle_iMA_1,0); // the value of the 1st MA on i bardouble MA2_curr=iMAGet(handle_iMA_2,0); // the value of the 1st MA on i barfor(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 bardouble 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" -> Buyif(MA1_prev<MA2_prev && MA1_curr>MA2_curr)
signal=1;
elseif(MA1_prev>MA2_prev && MA1_curr<MA2_curr)
signal=-1;
//---
MA1_curr=MA1_prev;
MA2_curr=MA2_prev;
}
IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrCrimson); // Поменяет цвет самого первого по счёту уровня на цвет CrimsonIndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrDeepSkyBlue); // Поменяет цвет второго по счёту уровня на цвет DeepSkyBlue
ありがとうございます。アルゴリズムの最初の2点を満たし、最初のバーに2つのMAの値があるとき、2つのMAを交差するバーの数を求めるループはどのように書けばよいのでしょうか?
/
.
嗚呼、結局は配列で解決したわけではないんですね。
注:配列による解決策(指標からFirst[]、Second[]、Third[]配列への最後の3つの値のコピー)は、2つのiMA- OnTick()を交差させる ことです。
あなたの場合(一度に1つの値)、ループは次のようになります。
MA1_curr - インジケータMA1の#iバーの値、MA1_prev - インジケータMA1の#i+1バーの値。
MA2_curr - インジケータMA2のバー#iの値、MA2_prev - インジケータMA2のバー#i+1での値
クロスが発生した場合(変数シグナルが「-1」または「1」)-iの値は、クロスが発生したバーの番号になります。
これはクロスオーバーを見つけるための最も単純なアルゴリズムですが、最も正確なものではありません。
ああ、やっぱり配列は使わないことにしたのか...。
ありがとうございます、他のMAクロス EAを例として使わせていただきました
クロスした後、3本目か5本目か...n本目のバーでエントリーしたい。
あなたの場合(1つの値を取得する)、サイクルは次のようになります。
クロスオーバーが見つかったときに、ループの出口がないのはなぜですか?
これらの条件をループの外に出すことは可能でしょうか?
.
こんにちは。相場履歴をインポート するために、FinamまたはMFD.ruサーバーから履歴データをダウンロードする形式を教えていただけませんか?全くできません。txtからcsvに保存して終わりなんですけど。
こんにちは。相場履歴をインポートするために、FinamまたはMFD.ruサーバーから履歴データをダウンロードする形式を教えていただけませんか?全くできません。txtからcsvに保存して終わりなんですけど。
MetaTrader 5では、何もダウンロードする必要はありません :)- トレードサーバーに接続すると、すぐにリアルティックの履歴を確認することができます。CopyTicksに 注目
MetaTrader 5では、何もダウンロードする必要はありません:)- トレードサーバーに接続すると、すぐにリアルティックの履歴を確認することができます。CopyTicksに 注目
10年分のロシア株があればいいんです。私のブローカーはそこまでしてくれないし、見つけられそうにない。
問題の内容
操作の流れ
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を変更すると期待通りになります。インジケータは再描画されるので、線がレベルを超えたら色が変わる。でも、私にとっては、以前と同じレベルです :)
詳細はこちら
...
5.0 Build 1755
問題の内容
操作の流れ
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を変更すると再描画されます。インジケータは再描画されるので、線がレベルを超えたら - 色が変わるのです。でも、私にとっては、以前と同じレベルです :)
詳細はこちら
...
5.0 Build 1755
問題の内容
回答が気に入らない理由を別トピックで教えてほしいです。
トレーディング、自動売買システム、ストラテジーテストのためのフォーラムです。
MQL5 #property indicator_level のヘルプが必要です。
アレクセイ・ビクトロフ さん 2018.01.31 09:06
イゴール、私たちはどちらも間違っている。すぐに課題が理解できなかった......。
また、#propertyディレクティブの他に、インジケーターのレベルを設定する関数もあります。
従って、このレベルは受信インジケーターパラメーターで設定する必要がある。この場合、レベルは指定された値で描画されるので、この値で変更する必要があります。
テストケース
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
バグ、バグ、質問
アレクセイ ロディオノフ さん 2018.02.06 16:31
ここで、面白いものがあります。
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>