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

 
Sepulca:

私ならこうする。


追伸:同時に回答)))

理解できない。

if(shift>0) shift=shift-1;

最初のバーで開いている場合、ゼロからゼロまで見る?

 
artmedia70:

理解できない。

最初のバーで開いている場合、ゼロからゼロまで見ているのでしょうか?


これは、注文の開始価格が、開始の瞬間にすでにLowよりずっと高い場合に備えて、少し安心するためのものです。つまり、オープニングバーを検索に使わないのです。そのためのPERIOD_M1です。
 
Sepulca:
これは、注文の開始価格が、開始時にすでにLowよりかなり高い場合に備えて、小さなヘッジを行うものです。つまり、検索にオープニングバーを使用しないのです。そのためのPERIOD_M1です。

私なら違う方法でやりますね。一般的には、ポジションが1小節以上続いたときに検索を開始します。結局、ベストプライスはオープニングバーですぐかもしれないので、それを無駄にすることになる。
 
artmedia70:
私なら違う方法でやります。一般的には、ポジションが1小節以上続いてから検索を開始することになりますね。結局、ベストプライスはオープニングバーだけかもしれないので、それを無駄に...

私もそう思います。注文を出した瞬間から最小値を再検索するよりも、各ティック ごとに配列内の未決済注文の最小値(または最大値)を記憶しておき、条件に達した時点で注文をクローズする方が、いわば効率的かもしれませんね。

 ShortOrderTicket[i]=OrderSend(Symbol(),OP_SELL,......
 if(ShortOrderTicket[i]>=0) min[i]=Bid;
 //.....................................................
 //На каждом тике обновляем минимумы для каждого открытого ордера
 for(i=0;i<N;i++){
  if(ShortOrderTicket[i]>=0){
   min[i]=MathMin(min[i],Ask);
  }
// Если достигнуто условие, закрываем ордер
  if(Ask>min[i]+Delta) if(OrderClose(ShortOrderTicket[i],.....))ShortOrderTicket[i]=-1;
 }
また、接続が切れたり、アドバイザーの再起動などのトラブルがあった場合、注文時のストップロスを随時修正するようにしています。
 
artmedia70:
ここでは配列は参照渡しでなければならないと主張しました。そうでなければ,この関数は厳密に定義された1つの配列だけを扱う必要があります.グローバルに定義していても、 。


ふむ。どの配列が呼び出し側の関数に 渡されるかに依存します。特定の配列であれば、呼び出された関数はその配列で動作するのですが・・・。なぜなら、それは...

もし、例えば

void FindOrders(int massive[])
{
   int oType;
   ArrayInitialize(massive, 0);
   for (int i=OrdersTotal() - 1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      
      oType = OrderType();
      massive[oType] = massive[oType] + 1;
   }
}

このように呼びかけることで

FindOrders(OrdersMassive)

OrdersMassive 配列と連動しています。

といった具合に。

FindOrders(massiveOfOrders)

massiveOfOrders 配列で。

 
取引開始時のスプレッドを 調べる方法、もっと言えばログに表示させる方法を教えてください。
 
Forexman77:
取引開始時にスプレッドの大きさを知る方法、もしくはログに表示する方法を教えてください。

もし(spread) == 何らかの値であれば、...何かをしてください...(例えば、注文を開く、またはその値をジャーナルに印刷するなど)。あるいはその逆で、ある値と等しくないか大きい(小さい)場合は、ジャーナルに表示し、何か処理をする。好きなようにやればいいんです。
 

昨日の質問を繰り返させていただきます。別スレッドに投稿するのはやめてほしい。不明な点があれば、すべてお答えします。

必要なポジションを閉じるのにまだ苦労しています。状況は次のとおりです。

1.ポジションの閉鎖を追跡している。

2.最後のポジションがテイクラインでクローズすると同時に......すべてのオープンポジションとペンディングポジションを一度にクローズする必要があります。すべてロットごとに、つまり大きなロットを一度に、そして小さなロットを順に並べて閉じています。これは、あくまでオーダーの経験を積むためのものです。

実装は以下の通りです。

tick毎にstart() で。

 for (int ord=OrdersTotal()-1; ord>=0; ord--)
   {
      if (!OrderSelect(ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() == 6) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();
              
      // Блок модификации ордеров       
      if (i_sl != 0 || i_tp != 0)
      {
         if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
         {
            OrdersModifyer(g_ticket);
         }
      }
      // Закрытие всех ордеров, если последний ордер закрыт
      if (isCloseByTakeLastOpenPos(2))
      {
         // if (g_type < 2)
          {
              ClosePosBySortLots();
          }
          //else
          if (g_type > 1)
          {
              DeletePendingOrders(g_ticket);
          }
      }
   }

保留中の注文は必要に応じて削除されるので、成行注文を閉じることに関心があります。以下はその内容です。

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos(int delta)
{
   datetime lastOrderCloseTime = -1,               // Время закрытия последнего открытого ордера
            lastOOTHist = -1;                     // Время открытия последнего открытого ордера из истории
   int j = -1;
   pr ("Запустилась функция isCloseByTakeLastOpenPos");
   
   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют..
  
      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
      {
         lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
         j = i;
         pr ("j = " + j + "   " + TimeToStr(TimeCurrent()));
      }
   }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
//      pr ("OTP() = " + OrderTakeProfit() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
  //    pr ("OOP() = " + OrderOpenPrice() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
      if (MathAbs(OrderTakeProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
                 "\n", "j = ", j,
                 "\n", "lastOOTHist = ", TimeToStr(lastOOTHist, TIME_SECONDS));
      }
   }
   else
   {
      Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
              "\n", "j = ", j,
              "\n", "не удалось выбрать ордер в истории");
      return(false);
   }
  
   for(int h=OrdersTotal()-1; h>=0; h--)
   {
      if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderMagicNumber() != i_magic)   continue;
         if (OrderSymbol() != Symbol())       continue;
         if (OrderType() > 1)                 continue;
         if (lastOOTHist < OrderOpenTime()) return(false);  // Выбранная рыночная позиция открыта позже закрытой по тейку
      }
      else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
   }
   
   return (true);
}

//+-------------------------------------------------------------------------------------+
//| Закрытие ордеров, отсортированных по размеру лотов                                  |
//+-------------------------------------------------------------------------------------+
void ClosePosBySortLots()
{
   double a[][2];
   int p = 0;
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() < 2)
      {
         p++;
         ArrayResize(a, p);
         a[p-1][0] = OrderLots();
         a[p-1][1] = OrderTicket();
      }
   }
   pr ("ClosePosBySortLots(): " + "p = " + p);
   if (p > 0)
   {
      ArraySort(a, WHOLE_ARRAY, 0, MODE_DESCEND);
      for(i=0; i<p; i++)
      {
         if (OrderSelect(a[i][1], SELECT_BY_TICKET, MODE_TRADES))
         {
             if (OrderCloseTime() == 0) ClosePosBySelect();
         }
      }
   }
}
//+-------------------------------------------------------------------------------------+
//| Закрытие одного, предварительно выбранного ордера                                   |
//+-------------------------------------------------------------------------------------+
void ClosePosBySelect()
{
   bool   fc;
   color  clClose, clCloseBuy = Blue, clCloseSell = Red;
   double ll, pa, pb, pp;
   int    err, it, NumberOfTry = 3;

   if (OrderType() == OP_BUY || OrderType() == OP_SELL)
   {
       for (it=1; it<=NumberOfTry; it++)
       {
           while (!IsTradeAllowed()) Sleep(5000);
           RefreshRates();
           pa = MarketInfo(OrderSymbol(), MODE_ASK);
           pb = MarketInfo(OrderSymbol(), MODE_BID);
           if (OrderType() == OP_BUY)
           {
               pp = pb; clClose = clCloseBuy;
           }
           else
           {
               pp = pa; clClose = clCloseSell;
           }
           ll = OrderLots();
           fc = OrderClose(OrderTicket(), ll, pp, 30, clClose);
           if (fc)
           {
              break;
           }
           else
           {
               err = GetLastError();
           }
       }
   }
   else Print("Некорректная торговая операция. Close ");
}

なぜか一部の注文が締め切られない。私はいくつかのセグメントを見たときに印刷すると、私は何も理解していない。以下はその一例です。

コメントでは、lastOOTHist = 01:30:00となって いますが、これは実際には正しくありません。結果ウィンドウでlastOOTHistを確認すると、次のようになります。

閉店時間が違うのですが...。

ここで何が問題なのか?

 
hoz:


ふむ。どの配列が呼び出し側の関数に渡されるかに依存します。特定の配列であれば、呼び出された関数はその配列で動作するのですが...。なぜなら、それは...

もし、例えば

このように呼びかけることで

OrdersMassive 配列と連動している

といった具合に。

massiveOfOrders 配列で。


関数に変数(配列)を値で渡すと、関数内部でローカル 変数が生成され、myFunct(int my_var)とヘッダーで宣言します。こうすることで、この変数の変化を関数の外から見ることができなくなる。また、配列の場合、コンパイラはこのことを念押ししてくる。

変数の値の変化を外から(関数の外から)見たい場合は、変数を参照渡しする : myFunct(int& my_var)

 
hoz:


どの配列が呼び出し側の関数に渡されるかに依存します。ある配列があれば、呼び出された関数はその配列で動作する...。こんな感じです...。

もし、例えば

このように呼ぶことで

OrdersMassive 配列と連動している

そして、このように。

配列massiveOfOrders を持つ

その通りです。つまり、同じサイズと型の配列なら何でも渡せるのに、なぜ特定の配列を関数自体にハードコードさせる必要があるのか、ということです。