MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1739

 
Artyom Trishkin #:

CopyRates()の最初の呼び出しで、履歴データのスワップが開始されました(1週間実行しないと、また同じことが起こります、まあ、1週間でなくても、ある程度の時間はかかりますが)。
サーバーにあるデータ量を確認し、利用可能な量をExpert Advisorと比較すればいいのです。必要量より少ない場合 - 次のティックまでEAを残す。次のティックで、もう一度確認する。一定の試行回数で必要な量の履歴が得られない場合、このエラーは必要な処理を行う必要があります。

情報提供ありがとうございました



Nキャンドル前の履歴にClose[N]+50*PointとClose[N]-50*Pointの2つの反対方向のターゲットが設定されています。
次に、価格がいずれかのターゲットに到達するという条件があります(if (High[i]>Close[N]+50*Point) or(if (Low[i]<Close[N]-50*Point)
条件を
満たすと、 Close[N] からHigh[i]までの距離がx[high]=High[i]配列に書き込まれます。


そして、Print(x[high]) で確認すると、10個中1〜2個が50未満と表示されます!一方は12個、もう一方は49個です。ただし、厳密には+50*ポイントです。8~9が正解(50以上)、1~2が異常。テスター経由ではなく、実際のチャートにExpert Advisor(取引機能なし)を設置したところ、履歴と連動して間違った結果が表示されました。 値が大きいほど、このようなエラーは少なくなります。スプレッドが邪魔をしているのかと思いきやMT4は履歴にスプレッドがないようです

 
Artis98 #:

フォーラムユーザーの皆様、経験豊富なプログラマーの皆様、こんにちは。EAを確定するのに協力してほしい))。コードアドバイザーに2つのことを追加する方法を教えてください。

1.TPとSL、そしてあるロット(おそらく0.01)で注文(1回目)をオープンします。この注文が利益確定で終了した場合、クールで何も変わりません。しかし、この(1回目の)注文がSLで決済されると、その直後の次の注文(2回目)は2倍のロット(0.01*2=0.02)で発注されることになります。この2番目の注文がTake Profitで決済された場合、次の注文(3番目の注文)は通常のロットで発注されます。つまり、前の注文(1番目)がSLで決済された後の次の注文(2番目の注文)には、2倍のロットが必要なのです。3回目の注文が2回連続でSLで決済される場合、TPの決済が行われなくなるまでロットは2倍されたままになります。追加すべきロジックを詳細に記述できたと思います。


2. そして、2番目に追加しなければならないのは、SLの動きです。さて、例で説明しましょう。- 500.価格が要求された方向に動き、注文の始値から+100pipsを通過したとき。注文の始値から+100になったら、SLは基準の-500から+90に移動するはずです。つまり、注文の始値から+100pipsになったら、S,Lを+90pipsに設定してBreakevenに移行させるのです。その後、価格がさらに希望の方向に動き、さらに+50pips通過すると、S.L.は50pips移動⇒注文開始価格から+140pipsになるはずです。すなわち、S.L.はまず基準位置から注文の始値から+90pipsまで移動し、その後+50pips(-500 => + 90 => + 140 => + 190 など)を過ぎたら移動します。そして、価格がT.P.に達するまで、どちらかになります。または、トレンドが反転してS.L.にぶつかったとき。


私は詳細にすべてを説明したことを願って、私は本当にこれらの不足している要素を追加することにより、Expert Advisorの準備が整うので、あなたの助けを願っています))ご不明な点があれば、ご質問ください)))以下にExpert Advisorのコードの一部を貼り付けます。

1点目は、ポジションを建てる前に、前のポジションがどのように決済されたかを確認することです。SLを取るなら、ロットは2倍になるはずです。ロットは、前のポジションのロットの半分で増やすのではなく、設定かコードのどこかで設定する必要があります。そして、オープンする前に、条件を確認します。もし、前のポジションがSLによってクローズされたなら、ダブルロットでポジションをオープンします。

2つ目については昔、このスレッドにトレーリングストップのサンプルを投稿したことがあります。探してください。メッセージの中の私のプロフィールの方が良いですよ。ここで100ページ以上見るより、そちらの方が早いでしょう。そして、見つかった例をもとに、自分でトロールを作成してみるのです。

 
Artyom Trishkin #:

CopyRates()の最初の呼び出しで、履歴データのページングが開始されました(1週間実行しないと、また同じことが起こります、まあ、1週間でなくても、しばらくはそうでしょう)。
サーバーにあるデータ量を確認し、利用可能な量をExpert Advisorと比較すればいいのです。必要量より少ない場合 - 次のティックまでEAを残す。次のティックで、もう一度確認する。必要な試行回数が得られない場合 - 必要に応じてエラーを処理する。

ロードされたバーの数をプログラムで取得することはできますか?

私自身は、各TFの名言のアーカイブで日付を見るだけで、計算上ではそれを超えないようにしています。

このタスクはこのフォームでは不要かもしれません。 適切な量のバーがロードされたときにフラグを取得する方が正しいのですが、1つまたは別のシンボルに対して一度もロードされないかもしれません。

 
Artyom Trishkin #:

1点目は、ポジションを建てる前に、前のポジションがどのようにクローズ したかを見ることです。SLでなら、ロットは2倍になるはずです。ロットは前のポジションのロットから倍増させるのではなく、設定かコードのどこかで設定したものから倍増させる必要があります。そして、オープンする前に、条件を確認します。もし、前のポジションがSLによってクローズされたなら、ダブルロットでポジションをオープンします。

すでにコードで変更したようです。

//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
 double Lots()  // Расчет объема лота
  {
   int n=0;
   double Lotscount;
   double OL=Lot;
   
   
   if(Lot>0) return(LOT());          // "если во внешней переменной "Lot" стоит число больше 0 => будет фиксированный лот без авт. расчёта" 
   Lotscount=AccountFreeMargin()/10000;  // раcчёт лота - свободная маржа/9000 => 100/9000=0.01 лота 
   Lotscount=MathMin(15,MathMax(0.01,Lotscount));
    if(Lotscount<0.1) Lotscount=NormalizeDouble(Lotscount,2);
    else 
     {
       if(Lotscount<1) Lotscount=NormalizeDouble(Lotscount,1);
      else       Lotscount=NormalizeDouble(Lotscount,0);
     }
     
     for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
          if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
            if (OrderProfit()<0) 
             {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++; 
               if (OrderProfit()>0) return(Lotscount);
            }
            else
            {
               if (n==0) {Comment("2");return(Lotscount);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
      return(Lotscount);
 }
//------------------------------------------------------------------
double LOT()
{
   int n=0;
   double OL=Lot;
   for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
            if (OrderProfit()<0) 
            {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++; 
               if (OrderProfit()>0) return(Lot);}
            }
            else
            {
               if (n==0) {Comment("2");return(Lot);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
   return(OL);
}

それとも、間違っているのでしょうか?また、ロットに関する2つの事柄をどう変更すればいいのかわかりません。1つ目は、2倍ロットの注文は一度だけ、1つの注文(S.L.のついた注文の次の注文)でしか開けないことです。そして2つ目は、追加方法がわからないのですが、S.L.が2つ並んだ場合(S.L.によって2つの注文が連続して閉じられた場合)、3番目の注文はロットをさらに2増やして(2*2*2)開くのではなく、2番目の注文のように1回(2*2)だけ開くようにすることです。

 
Artis98 #:

すでにコードで変更したようです。

それとも、間違っているのでしょうか?あと、ロットの2つの変え方がわからない。1つ目は、ダブルロットオープンの注文を1回だけ、1つの注文(S.L.のある注文の次の注文)だけにすることです。そして2つ目は、追加方法がわからないのですが、S.L.が2つ並んだ場合(S.L.で閉じた注文が2つ並んだ場合)3つ目の注文はロットをさらに2増やして(2*2*2)開くのではなく、2つ目の注文のように1回(2*2)だけ開くようにすることです。

注文番号1:通常ロットの注文、注文番号2:大きいロットの注文の2種類の注文があります。ロットは、SLタイプ#1のみインクリメントされます。

注文の種類を「コメント」などで保存する。あるいは、自分で暗記するのがよいでしょう。 注文に関することは、すべて暗記するのがよい習慣です。

 
Maxim Kuznetsov #:

注文番号1:通常ロットの注文、注文番号2:増加ロットの注文の2つの注文タイプがあります。ロットは、SLタイプ#1のみインクリメントされます。

注文の種類を「コメント」などで保存する。あるいは、自分で暗記するのがよいでしょう。 注文の内容をすべて覚えておくのはよい習慣です。

私たちは何も暗記する必要はありません(特に、暗記するとさらに再構築が必要になりますから)。前のポジションがどのようにクローズされたかを知っていれば十分である。以上です。2つも3つも、100個も続けて、あるいはストップロスで閉じない100個も知る必要はなく、最後の位置だけを知ることができます。ストップロスで決済した場合、次の決済はダブルロットで決済する必要があります。しかし、ロットは前のポジションのロットから倍増させるのではなく、プログラムの通常ロットに設定されているものから倍増させる必要があります。そして、もしポジションがストップロスで決済されない場合は、同じロットで次のポジションを建てる必要があります。ストップロスでポジションが決済された場合、次のポジションはロットを2倍にします。以上です。それ以外のことは知らなくていいのです。

 
Artyom Trishkin #:

彼は何も記憶する必要がない(特に、記憶にはその後の回復が必要だから)。過去のポジションがどのようにクローズされたかが分かればよい。以上です。彼は、2つ、3つ、または100を連続して、または非連続的にストップロスで閉じる必要はなく、過去の位置だけを知ることができます。ストップロスで決済した場合、次の決済はダブルロットで決済する必要があります。しかし、ロットは前のポジションのロットから倍増させるのではなく、プログラムの通常ロットに設定されているものから倍増させる必要があります。そして、もしポジションがストップロスで決済されない場合は、同じロットで次のポジションを建てる必要があります。ストップロスでポジションが決済された場合、次のポジションはロットを2倍にします。以上です。それ以外のことは知らなくていいのです。

人に指図するのはやめましょう。

データを記憶して作業する必要があります

 
Artyom Trishkin #:

彼が知るべきは、過去のポジションの閉じ方だけだ。以上です。2回、3回、100回と連続してストップロスで決済されたかどうかは必要なく、過去のポジションを知るだけでいいのです。ストップロスで決済された場合は、次のポジションをダブルロットで建てる必要があります。 ストップロスで決済された場合は、次のポジションをダブルロットで建てる必要があります。

これは私が必要としているもので、実はそれが問題なのですが、どのようにコードに書けばいいのでしょうか?

 

こんにちは!
MT5用ではなくMT4用にコンパイラを強制的にコンパイルする方法をどなたか教えてください。

拡張子が*.mq4なら問題ないのですが、拡張子が*.mqhだとコンパイラが*.mq5として受け入れてしまい、エラーが発生します。

 
Sergey Zhukov #:

こんにちは!
MT5用ではなくMT4用にコンパイラを強制的にコンパイルする方法をどなたか教えてください。

拡張子が*.mq4なら問題ないのですが、拡張子が*.mqhだとコンパイラが*.mq5として受け入れてしまい、エラーが発生します。

ファイルを渡してください。それは何か新しいですね、初めて聞きました。
理由: