どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 846

 
Pokrov:

関数の後にGetLastErrorがありますが、エラーが発生した場合、このブロックに移動して(書いてある通り)コマンドは実行されないのでしょうか?OrderSend() -> GetLastError -> エラーブロック Sleep(3000) RefreshRates() -> ブロックを終了し、条件が残っていれば OrderSend() を再度要求する、といったチェーンは理解できましたが。あるいは、私の推理や概念が間違っているのか。ブロック内に戻り値1か0を書きたいとのことですが、私の関数はSignalBuyのようなブーリアン値とは関係ない単純なもので、私の理解が正しければ、戻り値はそこで返すべきものだと思うのですが。

エラー時の取引試行回数のループを作る。取引環境をリフレッシュする。前回のエラーの値をクリアし、返された結果を確認しながら取引要求を送信します。エラーが返された場合、それを分析し、エラーコードに応じて、サイクルを完全に終了させるか、エラーを修正するために必要なアクションを行い、サイクルの次の反復に進みます。取引に成功した場合、ループを中断し、取引要求 結果の後処理を行うプログラムロジックに対応する値(関数実行成功フラグまたは注文受付番号等)を呼び出し側のプログラムに返します。
 
Pokrov:

関数の後にGetLastErrorがありますが、エラーが発生した場合、このブロックに移動して(書いてある通り)コマンドは実行されないのでしょうか?OrderSend() -> GetLastError -> エラーブロック Sleep(3000) RefreshRates() -> ブロックを終了し、条件が残っていれば OrderSend() を再度要求する、といったチェーンは理解できましたが。あるいは、私の推理や概念が間違っているのか。ブロック内に戻り値1か0を書きたいとのことですが、私の関数はSignalBuyのようなブーリアン値とは関係ない単純なもので、私の理解が正しければ、戻り値はそこで返すべきものだと思うのですが。

また、あなたの例では、エラーが出た後のリアクションがないことを付け加えておきます。確認したところ、ちょっと寝ようと思ったのか、データをリフレッシュしたのか、以外とそうでもなかったです。OnTick()関数が 完了した時点で終了させるだけ
 
こんにちは。

アドバイスをお願いします。条件に従って、ポジションをクローズし、121秒後に新しいポジションをオープンする必要があります。Sleep(121000)でどうすればいいのでしょうか?

if(GetProfitOpenHigestInPoint(NULL,OP_BUY,magic) > PiespieduClose*10)
{
ClosePosWithMaxProfitInCurrency(NULL,OP_BUY,magic);
Sleep(121000);
OpenPosition(NULL, OP_BUY, LotSize(),0,0,magic); 
}
 
abeiks:
ごきげんよう。

アドバイスをお願いします。条件に従って、ポジションをクローズし、121秒後に新しいポジションをオープンする必要があります。Sleep(121000)でどうすればいいのでしょうか?

ヘルプ: OnTimer()
 
artmedia70:
OnTimer()による救済
ありがとうございました。OnTimer()を使ったことがなく、この部分はvoid OnTick()の中にあります。 OpenPosition()関数をOnTimer()で処理することはできますか?もし可能なら、そこにOnTimer()を正しく挿入する方法をコードで修正してください...。
void OnTick()
{
...

if(GetProfitOpenHigestInPoint(NULL,OP_BUY,magic) > PiespieduClose*10)
{
ClosePosWithMaxProfitInCurrency(NULL,OP_BUY,magic);
EventSetTimer(121); 
OpenPosition(NULL, OP_BUY, LotSize(),0,0,magic); 
}

...   
}
 

Windows 7を再インストールし、Mt4をインストールしようとしたところ、ファイルがダウンロードできないのですが、どうしたらいいでしょうか?

 
Alexeiさん、Artemさん、専門的なコメントとアドバイスをありがとうございました。
 
abeiks:
ありがとうございます。OnTimer()を使ったことがありません。 この部分のコードはvoid OnTick()にあります。 では、OpenPosition()関数はOnTimer()で処理されるのでしょうか?もし可能なら、そこにOnTimer()を正しく挿入する方法をコードで修正してください...。

OnInit()でタイマーをスタートさせる。

EventSetTimer(1); // раз в секунду

カウントダウンを開始するには、タイマーの最後の位置の終了時刻を求め、この時刻から121回スクンデッドカウントする必要があります。新しいポジションをオープンするフラグを渡すには、プログラム全体をスコープとするグローバル変 数を使用します。初期状態で121より大きい値、例えば122を含むようにすることができます(設定で待ち時間を変更できます)。

OnTick()で、この変数を確認します。121より大きく、ポジションがない場合は、ポジションをオープンし、正常にオープンできたかどうかを確認した後、変数を0にリセットします。

ポジションが閉じられると同時に、タイマーはその時刻を確認し(これは1秒に1回連続して行われます)、現在時刻からポジションの閉鎖時刻までが121秒未満であれば、タイマーはカウントを開始し、毎秒、変数の値が1ずつ加算されます。

だいたいそうです。バグがあるかもしれないところ - ポジションがまだ閉じられていない場合、その閉鎖時間はゼロに等しくなります。そのため、カウントダウンを開始する際に不具合が発生することがあります。例えば、変数を-1にリセットすることができます。

はい、OnDeinit()でタイマーを破壊することを忘れないでください。

//+------------------------------------------------------------------+
   void OnDeinit(const int reason) {EventKillTimer();}
//+------------------------------------------------------------------+
 
artmedia70:

OnInit()でタイマーをスタートさせる。

カウントダウンを開始するには、最後にポジションを閉じた時刻をタイマーで求め、その時刻から121秒をカウントする必要があります。新しいポジションを開くことを許可するフラグを渡すには、プログラム全体で拡張可能なグローバル変数を使用します。初期値として121より大きい値、例えば122を含ませることができます(設定で待ち時間を変更できます)。

OnTick()では、この変数をチェックします。121より大きく、ポジションがない場合は、ポジションをオープンし、オープンが成功したかどうかを確認した後、変数をゼロにリセットします。

ポジションが閉じられると同時に、タイマーはその時刻を確認し(これは1秒に1回連続して行われます)、現在時刻からポジションの閉鎖時刻までが121秒未満であれば、タイマーはカウントを開始し、毎秒、変数の値が1ずつ加算されます。

だいたいそうです。バグがあるかもしれないところ - ポジションがまだ閉じられていない場合、その閉鎖時間はゼロに等しくなります。そのため、カウントダウンを開始する際に不具合が発生することがあります。例えば、変数を-1にリセットすることができます。

はい、OnDeinit()でタイマーを破壊することを忘れないでください。

了解です、ありがとうございます。一行でできると思っていたのですが、おそらくもうちょっと頑張らないといけないでしょうね。

 
abeiks:

なるほど、ありがとうございます。一行でできると思っていたのですが、もっと手間がかかるんでしょうね。