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

 
skyjet:

こんにちは!この関数のエラーをお探しですか?

未決済の注文は、発注から2日後に削除するという考え方です。

min=1440とした。

if (OrdersTotal()>0)
{  for (int i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderSymbol()!=Symbol()) continue;
         if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
         {  if(TimeCurrent()-OrderOpenTime()>=min)
            {  OrderDelete(OrderTicket());
               return;
         }  }
}  }  }
 
skyjet:

こんにちは!この関数のエラーをお探しですか?

未決済の注文は、発注から2日後に削除するという考え方です。

min=1440とした。


なぜ、保留中の注文を 追跡して削除 したいのですか?その際、datetime expiration=TimeCurrent()+min*60+sec に設定する必要がある。min*60+sec後に自ら削除される。
 
Sepulca:

なぜ、保留中の注文を監視し、削除する必要があるのですか?datetime expiration=TimeCurrent()+min*60+sec とすることで、min*60+sec後に自己削除されます。
おそらく、保留中の注文は 何らかのアルゴリズムに従って決済されるので、例えば2日という別の条件があれば、1日で決済されるでしょう。2日間。
 
Sepulca paladin80 ありがとうございますdatetime expiration は、まさに私たちが必要としているものです :)
 

paladin80:

OrderOpenTime() は、注文の開始時刻を返します。

未決済注文の 場合、この関数はゼロを返します。

 
PapaYozh:

OrderOpenTime() は、注文の開始時刻を返します。

保留中の注文の場合、この関数はゼロを返します。

うーん、関数そのものを確認しないまま、さっそくコードをいじってみました。そうですね、OrderOpenTime()はブローカーがポジションをオープンした時刻を表示しますが、ブローカーが保留中の注文を 受理した時刻は表示されません。すなわち、おそらく、注文ですぐに締め切りを指定するか、注文送信時刻を(どうせ使わないなら)マジックナンバーに記録して、TimeCurrent() と OrderMagicNumber( ) を比較すればよいのではないでしょうか。
 

こんにちは。カスタムインジケータの扱いを助けてください。

トレンドラインまでの距離を求める問題を解いています。トレンドラインがプロットされている時間枠で(ターミナルで開いている時間枠に関係なく)トレンドラインまでの距離を正確に取得する必要があります。トレンドラインの現在値は、関数ObjectGetValueByShiftを 使用して取得することができます。計算はオープン時間でしかできないので、小さなインジケータを書きました。 iCustom 関数にtimeframeパラメータがあることに惹かれましたが、このパラメータをどの程度考慮してインジケータを呼び出して いるのでしょうか。

その指標となるのがこちら。


#property indicator_chart_window
#property indicator_buffers 1
//--------------------------------------------------------------------   
extern string TL_name = "TL_1";
//--------------------------------------------------------------------   
double valueBuf[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
   //---- indicators
   SetIndexBuffer(0,valueBuf);
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1, White);
   //----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
   //----
   //----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
   int i;
   int    counted_bars = IndicatorCounted();
   //----
   i = Bars - counted_bars - 1;           // Индекс первого непосчитанного
   
   // Цикл по непосчитанным барам
   while(i>=0) {
      valueBuf[i] = NormalizeDouble(ObjectGetValueByShift(TL_name,i), Digits);
      i--;
   }     
   //----
   return(0);
}

この指標は、トレンドの現在値を考慮したものです。
インジケーターそのものを呼び出す。

TL_price_now = iCustom(NULL,PERIOD_D1,"TL_value",TL_name,0,0);

ここでは、例えばPERIOD_D1の 時間がパラメータとしてインジケータに渡され、その上にトレンドがプロットされ、その距離が計算されるはずです。

トレンドまでの距離を単純に計算しています。

dist = NormalizeDouble(TL_price_now - Bid, Digits);
そのように見えますが、そうではありません。他のタイミング(D1とは異なる)に切り替えると、インジケータは他の値を返します(私が切り替えたタイミングでは正しい)。
ここで疑問なのですが、iCustom 関数を呼び出す際に、どの程度まで期間を考慮するのでしょうか?
それとも、インジケータをいじってしまったのでしょうか?
 
pako:


t =OrdersTotal();

なぜ数えるのか? 数えたのか?


そこで、値を参照渡しするようにした。理屈は簡単です!
 
artmedia70:

私のバージョンでは、関数が短くなっています・・・。:)



はい、ちなみにこの実装方法の方がスマートです。スタート時のみ、追加機能でスペースが広くなっています。こんな感じになりました。

void FindOrders(int& massive[])
{
   int oType;
   ArrayInitialize(massiveOfOrders, 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();
      massiveOfOrders[oType] = massiveOfOrders[oType] + 1;
   }
}

int start()
{
   int i, oTotal = 0, oPending = 0;
   
   FindOrders(massiveOfOrders);
   
   for (i=0; i<=7; i++)
   {
       if (i > 1 && i < 6)
       {
           oPending += massiveOfOrders[i];
       }
       if (i < 6)
       {
          oTotal += massiveOfOrders[i];
       }
   }
   pr ("FindOrders(): " + "oTotal = " + oTotal);
   pr ("FindOrders(): " + "oPending = " + oPending);

最適化するようなことはないのでは?

というか、スタート地点に何もない方がよっぽど便利なんですけどね。そして、すべては純粋に機能によって呼び出されます。そして前回は、スタートが主機能のオーバーグロウ、追加機能のオーバーグロウと、いろいろあることが判明したわけですが......。

 

ごきげんよう。

Expert Advisorが動作しない、または取引できない理由を教えてください。