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

 
trader781:
最後の負け惜しみは、自分でどうするか、どんなパラメータを調整するか、考えればわかると思います

ありがとうございます。

テイクプロフィット 後、ロットを元の値に戻すにはどうすればよいですか?

if (OrderProfit()>0 && OrderType()<2)
            {
            lot=0.1
            }
そうはいかない)
 
wishmast:

ありがとうございます。

テイクプロフィット 後、ロットを元の値に戻すにはどうしたらよいですか?

if (OrderProfit()>0 && OrderType()<2)
            {
            lot=0.1
            }
そうはいかない)

私は次のようなスキームを持っています。

if (注文合計()==0)

{

初期ロットで開く

}

さもなくば

...

つまり、注文がない場合は、古いロットで開くことはありません。

もちろん、各オーダーを暗記することは可能ですが、その方法は教えてくれません。
 
Vitalie Postolache:
カウンターは、ある閾値に達すると開始され、初期値にリセットされる必要があります。

ありがとうございます。

問題解決に協力してください。
買いポジションが3つあり、売りポジションが現れたので、売りポジションと 一番古い買いポジションを決済 する必要があります。2つの買いポジションが残っているはずです。
全部閉じた状態にしています。

void OnTick()
  {
//---
int b_STOP,s_STOP,b=0,s=0;

  for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY) b++;
        if (OrderType()==OP_SELL) s++;
        if (OrderType()==OP_BUYSTOP) b_STOP++;
        if (OrderType()==OP_SELLSTOP) s_STOP++;      
      }  
     if (OrderType()==OP_BUY)
     {
     if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
     {
      OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
      CLOSEORDER(OP_SELL);
     }
     }
    }
  }

 

OrderProfit()<0関数が機能しない理由を説明してください。

   for(int q=OrdersHistoryTotal()-1; q>=0; q--)
      {
      if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderType()<2 && OrderMagicNumber()==magic)
            {
            if (OrderProfit()<0)
               {
               if (DayOfWeek()==1)
                  {
                  day1++;
                  Print ("Понедельник SL=",day1);
                  }
               if (DayOfWeek()==2)
                  {
                  day2++;
                  Print ("Вторник SL=",day2);
                  }
               }
            }
         }
      
      }

曜日 ごとのストップロスの数を確認したい。

for(int l=OrdersHistoryTotal()-1; l>=0; l--)
        {
        if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
           {
           if(OrderProfit()<0 && OrderType()<2)
              {
              oldticket=OrderTicket();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot=OrderLots()*4;
              }
           if (OrderProfit()>0 && OrderType()<2)
              {
              lot=0.01;
              }
           }
        }

と、ここでも同じ理由でうまくいかないと思います。

 
wishmast:

OrderProfit()<0関数が機能しない理由を説明してください。

   for(int q=OrdersHistoryTotal()-1; q>=0; q--)
      {
      if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderType()<2 && OrderMagicNumber()==magic)
            {
            if (OrderProfit()<0)
               {
               if (DayOfWeek()==1)
                  {
                  day1++;
                  Print ("Понедельник SL=",day1);
                  }
               if (DayOfWeek()==2)
                  {
                  day2++;
                  Print ("Вторник SL=",day2);
                  }
               }
            }
         }
      
      }

曜日 ごとのストップロスの数を確認したい。

for(int l=OrdersHistoryTotal()-1; l>=0; l--)
        {
        if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
           {
           if(OrderProfit()<0 && OrderType()<2)
              {
              oldticket=OrderTicket();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot=OrderLots()*4;
              }
           if (OrderProfit()<0 && OrderType()<2)
              {
              lot=0.01;
              }
           }
        }

とありますが、これも同じ理由でうまくいかないのでしょう。

なぜなら、DayOfWeek()は、最後に判明したサーバー 時刻の曜日のオーダー番号を返すからです。

そして、注文終了時刻の曜日が必要です:TimeDayOfWeek(OrderCloseTime());

 
Artyom Trishkin:

なぜなら、DayOfWeek()は、最後に判明したサーバー 時刻の曜日のオーダー番号を返すからです。

そして、注文終了時刻の曜日が必要です:TimeDayOfWeek(OrderCloseTime());

しかし、結果は同じで、if(OrderProfit()<0)を無視してループがあると、変数が大きな 値を取得するようです。

2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430208
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963665

また、ロットでのループはどうでしょうか? ここに間違ってコピーしてしまい、符号を修正しましたif(OrderProfit()>0&&OrderType()<2)、しかし本質は変わらず、この条件がなくてもループは正しく動 きます。

 
wishmast:

しかし、結果は同じで、if(OrderProfit()<0)を無視してループがあると、変数が大きな値を持って しまうのです。

2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430208
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963665

そして、ロットでのループについて? ここに間違ってコピーしてしまい、符号を修正しましたif(OrderProfit()>0&&OrderType()<2)) しかし、本質は変わらず、この条件なしでループは正しく 機能します。

day1 と day2 はどこで宣言されていますか?
 
Artyom Trishkin:
day1 と day2 はどこで宣言されていますか?
を、グローバルに、最初に、OnTick () の前に、そしてすべての関数の前に置く。
 
Artyom Trishkin:
day1 と day2 はどこで宣言されていますか?

注文の選択が間違って いるのか、うまくいきませんOrderProfit()<0最後の注文がTake-Pointで終了し、他に注文がないのに、なぜスキップするのかわかりません。 もしかして、履歴を検索したい場合は、ループの作り方が違うのでしょうか?

for(int w=OrdersHistoryTotal()-1; w>=0; w--)
      {
      if(OrderSelect(w,SELECT_BY_POS,MODE_HISTORY))

理由は、Expert Advisorは同様の条件でループを構築し、必要な動作をしますが、OrdersTotal() を使用して動作するためです。

for(int n=OrdersTotal()-1;n>=0;n--)            
         {                                          
         if(OrderSelect(n,SELECT_BY_POS))            
            {                                        
            if(OrderMagicNumber()==magic)                  
               {
               if(OrderType()>OP_SELL)
 
sile:
ありがとうございます。

問題解決に協力してください。
買いポジションが3つあり、売りポジションが現れたので、売りポジションと 一番古い買いポジションを決済 する必要があります。2つの買いポジションが残っているはずです。
すべて終了しました。

void OnTick()
  {
//---
int b_STOP,s_STOP,b=0,s=0;

  for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY) b++;
        if (OrderType()==OP_SELL) s++;
        if (OrderType()==OP_BUYSTOP) b_STOP++;
        if (OrderType()==OP_SELLSTOP) s_STOP++;      
      }  
     if (OrderType()==OP_BUY)
     {
     if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
     {
      OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
      CLOSEORDER(OP_SELL);
     }
     }
    }
  }

これは1サイクルで解決できるものではありません。このループでは,削除するオーダーのティッカーを配列に記憶させ,次のループでティッカー単位で削除するようにします。

さらに、中括弧がめちゃくちゃです。OrderSelect{} ブロックの外側で注文を扱っていますが、これは間違っています。

理由: