//+------------------------------------------------------------------+//Function BUY_pendingbool BUY_pending(string symbol,ENUM_TIMEFRAMES period,double volume,ulong magic = 0)
{
//----------------------------------------------------------------------------////Work variablesdouble price = 0, sl = 0, tp = 0; //Prices: Open, Sell stop, Take profitint ResCopy = -1; //Result of copying the data into an arrayint Dig = 0; //Digitsdouble bar_info[1];
bool Result = true; //Returned importance//----------------------------------------------------------------------------//ResetLastError();
//Checking the signal to stopping the trading systemif(IsStopped()) return(false);
//Preparation of structuresZeroMemory(TradeRequest);
ZeroMemory(TradeResult);
ZeroMemory(CheckResult);
//Copying the data into an array
ResCopy = CopyHigh(symbol,period,0,1,bar_info);
if(ResCopy==-1)return(false);
//Calculations
Dig = (int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
price = NormalizeDouble(bar_info[0] + 500*_Point,Dig);
追記
つまり、現在のバーを取得したい場合、この行で無駄に3本のバーを配列にコピーしているのです。
//Это не правильноint ResCopy = CopyHigh("EURUSD",PERIOD_D1,0,3,bar_info);
//так правильноint ResCopy = CopyHigh("EURUSD",PERIOD_D1,0,1,bar_info);
//если PERIOD_D1 не меняется вот идеальный вариант
High = SymbolInfoDouble(symbol,SYMBOL_BIDHIGH);
ilunga:
追伸:私の(そしてあなたの)コードでは、bar_info[1]は現在のバーの最大値であると仮定してよいでしょうか?
誰も現在のバーについて何も言っていない。:)
この例では、現在のバーを正確に表示する必要があります。
1. 配列の方向を定義する(0 bar - 現在または最高値)。
今回のように、配列を移動させる場合は、初期化ブロックの中で一度だけ行えばよいでしょう。関数の中で配列を隠すと、その場で定義してしまうのです。
2.配列がシリーズとして宣言されている場合、現在のバーは0となり、その前に閉じたバーは1となります。
少なくとも、私の記憶では。
何か見落としているかもしれませんが、現在のバーで開くには(すべての追加を考慮して)次のようになります。
配列を関数に移動させる!
そして、誰も現在のものについては何も言っていない。:)
例題を作り直しただけです。 現在のものが必要な場合は、そうしなければなりません。
1.アレイシリーズの方向を定義する(0 bar - 現在または最新)。
今回のように、配列を移動させる場合は、初期化ブロックの中で一度だけ行えばよいでしょう。関数の中で配列を隠すと、その場で定義してしまうのです。
2.配列がシリーズとして宣言されている場合、現在のバーが0となり、その前に閉じたバーが1となります。
少なくとも、私の記憶では。
配列を3要素に拡張してみました。現在の価格と 中身がミスマッチしてしまったんです。これが一番の理由だと思います。
結果(テストはGBPUSDで行いました。)
AskとBidの両方がゼロの最大値より大きく、2本目のバーの最大値より大きいことがわかる
EURUSDでテストを実行すると、すべてOKです。
not my」ペアのテストでは、「バーの情報は更新されたが、ティックはまだ存在しない」という状況になるような気がします。
配列を3要素に拡張しました。現在の価格と 配列の内容に矛盾があるのですが。それが一番の理由でしょう。
結果
AskとBidがともに0本目の棒グラフの最大値より大きく、2本目の棒グラフの最大値より大きいことがわかる。
配列の直列性を考慮しないコードですね。この結果で、例えば2000年に0バールがないとは誰も保証できない。
上記のコードは、配列 variant に含まれるすべての TF に適しています。
このコードがあるのは、理由があるのです。
もし、日足タイムフレーム(D1)だけでバーの最大値を特定したい場合は、配列を処理する必要はなく、関数の最初の部分を次のように変更するだけです。
配列の直列性を考慮したコードになっていませんね。この結果で、0バールが2000年にならないとは誰も保証できない。
上記のコードは、配列 variant に含まれるすべての TF に適しています。
このコードには理由があります
配列の直列性を考慮したコードになっていませんね。この結果、0バールが2000年にならないとは誰も言い切れない。
上記のコードは、配列 variant に含まれるすべての TF に適しています。
このコードがあるのは、理由があるのです。
よし、配列をダイナミックにしよう。
xxxの代わりにtrueとfalseを入れました。
その結果
и
配列内の順序は変更されるが、結果は変更されない。ビッドが配列の最大[0]番目のバーより大きい場合
ArraySetAsSeriesは動的配列のみ?
正直言って覚えていません。しかし、上に引用したコードの結果は、我々が得たものと一致しています(EURの場合、オープン価格は1.24516 GBPの場合、1.56721です)。
そうですね、現時点ではArraySetAsSeriesがなくても問題なく動きますが
追記
つまり、現在のバーを取得したい場合、この行で無駄に3本のバーを配列にコピーしているのです。
追記
例えば、現在のバーを取得する必要がある場合は、絶対にこの行の3つのバーを配列にコピーしてください。
ありがとうございました。このオプションはエラーなく動作し、この場合、十分な性能を発揮します。
しかし、上記のような疑問が残るのは、どうしてBidが最大値より大きくなるのか、ということです =(
ilunga:
しかし、上記のような疑問が残るのは、どうしてBidが最大値より大きくなるのか、ということです =(
まず、この最大値がどの期間でとられたものかを判断する必要がある。
配列が double bar_info[n] と宣言されている場合、その中の現在のバーが最大のインデックスとなる。
n = 2の場合、このコードは昨日の日足で動作します。
と、現在のバーを使ったこの
例えば、複数のバーをコピーした場合、現在のバーを取得するために以下のようにアレンジする必要があります(ただし、配列にコピーされたバーの 数を確認する必要があるかもしれません)。
まず、この最大値をどの期間でとるかを定義する。
配列が double bar_info[n] と宣言されている場合、その中の現在のバーが最大のインデックスと なる。