初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 230

 
Aleksey Mavrin:

とか、10秒後に必ず利益が増えるとか)

もちろんいつもというわけではありませんが、1分で値が飛んでしまって、EAが露骨に固定値でクローズしてしまうということはよくあることです。
 
Nargiz Ravanova:

言われた通りやったのですが、CloseAll()関数の後、1時間スリップしているにもかかわらず、Expert Advisorを閉じた後、なぜか数回トレードを開いてしまうのです。

datetime sleep = TimeCurrent();
if(sleep > TimeCurrent())
     return;
//---
double op = CalculateProfit();

if(op >= Profit && LastTime == 0)
     LastTime = TimeCurrent();
if(LastTime > 0 && TimeCurrent() - LastTime >= Second)

    {
     CloseAll();
     LastTime = 0;

     SendNotification("Trade is end");
     sleep = TimeCurrent()+60*60;
    }

そういうものなんです。もちろん、膝の上に書いただけです。

 
Konstantin Nikitin:

そんな感じです。もちろん、その場で書いただけです。

ありがとうございます。現在、EAは市場にあるすべてのトレードのうち、1つのトレードしかクローズしません。

スリップが発生せず、EAが再び新しい取引を開始し、スリップを無視しています。EAを見ると、もう一つ開くことはできないと思うのですが、以前のように戻すしかないのでしょうか。このEAで何をしたらいいのかわからない。

 
Nargiz Ravanova:

ありがとうございます!今はEAが全取引のうち1回しか決済しない、グリッドEAがあります。

というのも、"痒いところに手が届く "状態だからです。実装は無理だと思うので、以前のように戻すだけです。お礼を申し上げたい。

全体として実施する必要がある
理由は様々だろうが

 
Nargiz Ravanova:

ありがとうございます!今はEAが全取引のうち1回しか決済しない、グリッドEAがあります。

というのも、"痒いところに手が届く "状態だからです。実装は無理だと思うので、以前のように戻すだけです。すでに実装済みで、まだ実装されていないので、以前の状態に戻すだけです。

これなら、もっと意味があるはずですよね?

input double Profit   = 100.0;
input int    Second   = 10;
//+------------------------------------------------------------------+
void CloseAllSleep(void)
    {
     static datetime sleep_all = TimeCurrent();
     static datetime LastTime = 0;
     if(sleep_all > TimeCurrent())
          return;
//---
     if(LastTime == 0)
         {
          if(CalculateProfit() < Profit)
               return;
          LastTime = TimeCurrent();
         }
     if(TimeCurrent() - LastTime >= Second)
          return;
//---
     if(!CloseAll())
          return;
     LastTime = 0;

     SendNotification("Trade is end");
     sleep_all = TimeCurrent()+60*60;
    }

//--- Считаем профит открытых позиций
double CalculateProfit(void)
    {
     return 0.0;
    }
//--- Закрываем все позиции
bool CloseAll(void)
    {
     return true;
    }

繰り返しになりますが、これは純粋にわかりやすくするためのものです。そして、何をどのように実行する必要があるのか、自分自身で考えてみてください。

 
Nargiz Ravanova:
もちろん、常にではありませんが、価格が1分間だけ飛んで、Expert Advisorが固定価格でぶっきらぼうに終了することはよくあることです。

それでも、このやり方は最適とは言えないと思います。価格が飛んでいる場合は、プラスのスリッページがあるはずです。もしあなたが時間を待つなら - それはルーレットのゲームです - その後、何のための戦略ですか、あなたの利益はすでに与えられた2ポンドよりも低いかもしれません。

価格変動の スピードを測り、利益に向かって高ければ待つ、下がればカバーする方が合理的です。

 
Konstantin Nikitin:

そのほうが筋が通っていると思うのですが、いかがでしょう?

繰り返しになりますが、これは純粋に理解のためのものです。何をどう実装するかは、あなた次第です。

正直言ってよくわからない、忘れてくれ、何か考えるから。

 
Aleksey Mavrin:

それでも、このやり方は最適とは言えないと思います。価格が飛んでいるのであれば、スリッページはプラスになるはずです。もしあなたが時間を待つなら - それはルーレットのゲームです - その後、何のための戦略ですか、あなたの利益はすでに与えられた2ポンドよりも低くなる可能性があります。

価格変動のスピードを測り、利益に向かって高ければ待つ、下がればカバーする方が合理的です。

ここで単純なスリップを直せないからスピードの話になる))))
 
Nargiz Ravanova:
ここで単純なスリップを直せないからスピードの話になる))))

もしあなたが高い目標を掲げるなら、全能の神がその達成を助けてくれるでしょう;)

 
Nargiz Ravanova:
ここで単純なスリップを直せないからスピードの話になる))))

正確には、できないようです。そして、SLEEPについて。Expert Advisor全体をしばらくの間、凍結しますか?あるいは、ある機能だけを、鍛え上げた後。いずれにせよ、Expert Advisor の動作を中断する場合でも、長時間遅延のフラグを使用し、それを確認する際に、許可がなければOnTick/OnTimer に抜けるだけにしておく方がよいでしょう。短時間の遅延の場合は、はい、SLEEPを 使用することができます。
ちなみに、SLEEPは インジケーターでは使えません。

Sleep()関数はカスタムインジケータからは 呼び出せません。なぜなら、インジケータはインターフェイススレッドで実行され、その速度を低下させて はならないからです。

だから、フラッグの使い方を理解しておくと、将来的に必要になってくる。