//+------------------------------------------------------------------+//| Test.mq5 |//| Copyright 2022, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2022, MetaQuotes Ltd."#property link"https://www.mql5.com"#property version"1.00"
//ВХОДНОЙ ПАРАМЕТР
inputushort Constanta=50; //Константа//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- create timerEventSetTimer(20);
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//--- destroy timerEventKillTimer();
}
//+------------------------------------------------------------------+//| Timer function |//+------------------------------------------------------------------+voidOnTimer()
{
//---double open_0=iOpen(_Symbol,PERIOD_CURRENT,0);
if(open_0-SymbolInfoDouble(_Symbol,SYMBOL_BID)>Constanta*_Point)
Print("Цена прошла вниз расстояние больше чем Константа, поэтому нужно открыть позицию SELL!");
if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-open_0>Constanta*_Point)
Print("Цена прошла вверх расстояние больше чем Константа, поэтому нужно открыть позицию BUY!");
Sleep(20000);
if(open_0-SymbolInfoDouble(_Symbol,SYMBOL_BID)>Constanta*_Point)
Print("Цена прошла вниз расстояние больше чем Константа, поэтому нужно открыть позицию SELL!");
if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-open_0>Constanta*_Point)
Print("Цена прошла вверх расстояние больше чем Константа, поэтому нужно открыть позицию BUY!");
Sleep(20000);
if(open_0-SymbolInfoDouble(_Symbol,SYMBOL_BID)>Constanta*_Point)
Print("Цена прошла вниз расстояние больше чем Константа, поэтому нужно открыть позицию SELL!");
if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-open_0>Constanta*_Point)
Print("Цена прошла вверх расстояние больше чем Константа, поэтому нужно открыть позицию BUY!");
Sleep(20000);
}
//+------------------------------------------------------------------+
このコードを見てください:
よろしくお願いします。このコードを見てください:
ウラジミール、ありがとう。あいにく2日間はチェックできませんが、よろしくお願いします!
ありがとうございます。しかし、これは完成したコードではなく、あくまでも私の考えの方向性であることをご了承ください。間違っているかもしれません。確認してください。OnTimerを削除して、OnTick()で同じコードを試すという方法もあります。要するに、試してみてください。
それでは、ウラジミール。
現在の価格と時間を記録する。ティックごとに現在時刻と比較し、20秒以上経過していれば2番目の価格を記憶します。最初の価格と2番目の価格の差を計算します。得られた結果を定数と比較し、注文を出すかどうかを決定します。
現在の価格と時間を記憶します。ティックごとに現在時刻と比較し、20秒以上経過している場合は2番目の価格を記憶します。最初の価格と2番目の価格の差を計算する。得られた結果を定数と比較し、注文を出すかどうかを決定する。
つまり、1秒ごとに現在の価格を記憶し、このシリーズの各値を20秒間削除したときの現在の価格と比較する必要があるということですね。
比較は連続的でなければなりません。
このシリーズの各値が20秒間削除されたときに、現在の値と比較できるように、1秒ごとに現在の価格を記憶する必要があるということですね?
比較は連続的に行う必要があります。
ティックが均等に行くことはありません、問題は、それがすべてのティックをチェックする必要がある場合は、すべてのティックを記憶し、比較する必要があり、その後、アルゴリズムにあります。アルゴリズムに従った少ない回数で可能であれば、タイマーを使って1秒後に価格を記憶し、20秒後にも記憶して比較する。
1秒間に1ティック、5秒間に1ティック、1秒間に100ティックの場合もあります。5秒間に1ティックの場合と、1秒間に100ティックの場合にどう行動するかを決めなければなりません。
すべてのティックをチェックする必要がある場合は、すべてのティックを記憶し、比較する必要があります。アルゴリズムによれば、頻度を少なくすることが可能であれば、タイマーで1秒後に価格を記憶し、20秒後にも記憶して比較します。
1秒間に1ティック、5秒間に1ティック、1秒間に100ティックの場合もあります。5秒間に1ティックの場合と、1秒間に100ティックの場合にどう行動するかを決めなければなりません。
選択肢を選ぶ問題ではなく、それを書き記すことの難しさの問題なのだが......。今日初めて来ました。全くの素人です。
自分のアイデアを試してみたいだけなんです...。
選択肢を選ぶことが問題なのではなく、それを書き記すことが私にとって難しいかどうかが問題なのだ......。今日初めて来ました。全くの素人です。
自分のアイデアを試してみたいだけです。
アルゴリズムは正確でなければならないし、適用条件を理解していなければならない。それ以外の方法でコードを書くことはできない。コードは1つの動作のアルゴリズムを実現するものであり、不正確であってはならない。
そしてここでは、まず自分で書いた方がいい。
あなたは等号を理解している。
リングバッファ:
価格、時間」構造体の十分な大きさの静的配列(または2つの別個の配列)をバッファとする。
バッファの先頭と末尾への「ポインタ」(インデックス)という2つの変数を取ります。
ティックごとに要素を先頭に追加し、ポインタを進める。
時刻と末尾の要素を比較し、必要ならポインタを移動する。
価格を末尾の要素と比較する。
ポインタが配列の末尾に達した場合は、このポインタをゼロにリセットする。
バッファの先頭と末尾への「ポインタ」(インデックス)。
ティックごとに、要素を先頭に追加し、ポインタを移動する。
その時間を末尾の要素と比較し、必要であればポインタを移動する。
価格を末尾の要素と比較する。
ポインタが配列の末尾に達している場合、このポインタをゼロにリセットする。