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

 
Maxim Kuznetsov #:

は冗談か?

白黒で持っているのは(;;)

まあ、そうなんですが、魔法と注文魔法がイコールでない場合という逃げ道があるんです。
 
Nerd Trader #:
そうですね、ただ、魔法と秩序の魔法がイコールでない場合、その出口はありますね。

お試しください

int GetMagic(Order &order)
{
  int magic = 0;
  if(order.cmd == OP_SELLSTOP || order.cmd == OP_BUYSTOP)
  for(int i = OrdersTotal(); i > 0 ; i --)
   {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
       if(OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP)
         {
          if(magic == OrderMagicNumber()) magic+=1;
          else magic=0;
         }
      }
   }
  return (magic);
}
 
EVGENII SHELIPOV 選択されている注文の スワップ値を返す関数OrderSwap()とはどのようなものか教えてください。

注文のグリッドがある場合はどうするのですか?

マジックオーダーと金融商品のグリッドのオーダーのすべてのスワップの合計を計算する関数をお持ちの方はいらっしゃいますか?

ありがとうございました!!!

何のために必要なのか?
 
MakarFX #:
何のために必要なのか?

グリッドライフの長い大きなグリッドのオーダーをクローズする場合、オーダースワップは利益を食い、結果を非常に歪めてしまいます。

この機能でスワップ時の損失を補填したい。

 
EVGENII SHELIPOV #:

グリッドライフの長い大きなグリッドのオーダーをクローズする場合、オーダースワップは利益を食い、結果を非常に歪めてしまいます。

この機能でスワップ時の損失を補填したい。

グリッドは利益またはブレークイーブンで閉じていますか?
 
MakarFX #:

お試しください

int GetMagic(Order &order)
{
  int magic = 0;
  if(order.cmd == OP_SELLSTOP || order.cmd == OP_BUYSTOP)
  for(int i = OrdersTotal(); i > 0 ; i --)
   {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
       if(OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP)
         {
          if(magic == OrderMagicNumber()) magic+=1;
          else magic=0;
         }
      }
   }
  return (magic);
}
これで直りました、 if(order.cmd == OP_SELLSTOP || OP_BUYSTOP)だけは問題が解決していませんでした。
しかし、すべての命令を通過させる必要があります。魔導師そのものは、創作の瞬間にストッパーにのみ設定されます。ストッパーがOrderType()で作られることはまだないので理解できず、そのためにorder.cmdにオーダータイプの予備記録がある。そして、ここでは2つのループが必要です。1つは他のループにネストされ、マジック変数の1回の反復がOrdersTotal()からのすべての注文でチェックされるようにします。全て実装しているのですが、無限ループが発生してしまいます。
 
MakarFX #:
グリッドは利益で閉じているのか、それとも損益分岐点で閉じているのか?

はい、あるレベルのドローダウンでは、損失がゼロになり、損失がゼロになると、スワップによる醜い損失が発生します。

 
Nerd Trader #:
これは、私が持っていた if(order.cmd == OP_SELLSTOP || OP_BUYSTOP)
しかし、私はすべての注文が渡される必要があります。魔導師自体は、ストッパーだけを作成した場合に設定されます。ストッパーがOrderType()で作られることはまだないので分からない、事前にorder.cmdにオーダータイプを書いておく必要がある。そして、ここでは2つのループが必要です。1つは他のループにネストされ、マジック変数の1回の反復がOrdersTotal()からのすべてのオーダーでチェックされるようにします。
GetMagic(...)を使っている箇所を教えてください。
 
void OpenOrder(int db = -1){

  if(db == -1){
    Print("'db' должен иметь корректное значение");
    return;
  }

  Order order;

  //Если бид в границах ДБ (его хай/лоу) то инициализируем ордер для селстопа или байстопа
  if(Bid > db_last.low && Bid < db_last.hight){
    if(db == BEAR) order.InitForSell(SELLSTOP);
    if(db == BULL) order.InitForBuy(BUYSTOP);
  }

 ...

  if(order.is_init == true)
  {
    int order_send = OrderSend(Symbol(), order.cmd, 0.01, order.open_price, 10, 
    order.sl_price, order.tp_price, "", GetMagic(order), 0, order.arrow_color);

    if(order_send == -1){
      Print(order.error_text," | ",GetLastError()," db_last.third ",db_last.third,
        " | db_last.size_open_to_low ",db_last.size_open_to_low," | order.sl_price: ",
        order.sl_price," | order.cmd ",order.cmd);
      ResetLastError();
      return;
    }
  }
}

...

int GetMagic(Order &order)
{
  int magic = 0;
  //Если должен быть открыт стопордер и если есть уже открытые или отложенные 
  //ордера, то возможно некоторые с маджиком, это надо проверить и сгенерировать 
  //для нашего ордера уникальный маджик и отправить его на запись в массив
  if(order.cmd == OP_SELLSTOP || OP_BUYSTOP)
    if(OrdersTotal() >= 1)
      for(;;){
        magic++;
        for(int i = OrdersTotal(); i > 0 ; i --)
          if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) != false)
            if(magic != OrderMagicNumber())
              return magic;
            
      }
    //Если нет открытых или отложенных ордеров то увеличиваем значение 
    //маджика, чтобы он равнялся единице и отправляем на запись в массив
    else if (OrdersTotal() == 0)
      return (magic + 1);
  return magic;
}


解説によると、書き込み配列にmajicを送ると書いてあるので、majicがretornに戻れば良いので惑わされないで下さいね。
 
EVGENII SHELIPOV #:

はい、あるレベルのドローダウンでは、損失がゼロになり、損失がゼロになると、スワップによる醜い損失が発生します。

   double GetOrderSwap()
     {
      double order_swap = 0;
      for(int i = OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if (OrderType() == OP_BUY)
                 {
                  order_swap += OrderSwap();
                 }
              }
           }
        }
      return(order_swap);
     }