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

 

何が間違っているのか、教えてください。簡単なインジケータを作ろうとしています。


  {

   int limit,i;
   double last;
   int counted_bars = IndicatorCounted();
   //---- check for possible errors
   if (counted_bars < 0) 
       return(-1);
   //---- last counted bar will be recounted
   if(counted_bars > 0) 
       counted_bars--;
   limit = Bars - counted_bars;
//----
   for(i=limit; i>=0; i--)
   {
      double OptClose = Close[i]*10000;
      if (MathMod(OptClose,step1)==0)
      {
      Buffer0[i] = Close[i];
      last = Close[i];
      }
      else
      Buffer0[i] = last;
   }

//----
   return(0);
  }
//+------------------------------------------------------------------+

チャートウィンドウでは動作するのですが、Expert Advisorでテストしようとすると、何でもいいから描画するか、「ステップなし」になってしまいます。

 
Virtuon:

何が間違っているのか、教えてください。簡単なインジケータを作ろうとしています。

チャートウィンドウでは動作するのですが、Expert Advisorでテストしようとすると、何でもいいから描画するか、「ステップなし」になってしまいます。

      if (MathMod(OptClose,step1)==0)
         Buffer0[i] = Close[i];
      else
         Buffer0[i] = Buffer0[i+1];
 
PapaYozh:

試してみました。窓の中だけでも、こうはいかない。どうやら、ここには何らかの仕掛けがあるようだ。今はこの方法で動作していますが、恐ろしく遅いです。
 for(i=WindowBarsPerChart(); i>=0; i--)
   {
      double OptClose = Close[i]*10000;
      if (MathMod(i+step1,step1)==0)
      {
      Buffer0[i] = Close[i];
      last = Close[i];
      }
      else
      Buffer0[i] = last;
      Comment(Buffer0[WindowBarsPerChart()]," ",Buffer0[0]);
   }
最後のバーの再計算チェックを無効にした状態です。
 

MQL4プログラミングの達人たちよ、こんにちは。どうすれば可能なのか、アドバイスをお願いします。

プログラムコードの一部。

   LogAdd("Начинаю вычисления переменных для текущего тика ... ");  
   for (int i = OrdersTotal()-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS);           
      LogAdd("Выбираю ордер с тикетом: " + i); 
      if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) {    
         opnTime = OrderOpenTime();
         currentTicket = OrderTicket(); 
         currentStopLoss = OrderStopLoss();          
         LogAdd("Ордер открыт позже предыдущего, не является отложенным. Записываю переменные: opnTime - " + opnTime + ", currentTicket - " + currentTicket + ", currentStopLoss - " + currentStopLoss + ".");
      }
      if (OrderType() == OP_BUY) {         
         buyCntr ++;   
         buyOpnPrice = OrderOpenPrice();
         lotsSumBuy += OrderLots();
         TrailingByShadows(OrderTicket(), Period(), 11, 0); 
         LogAdd("Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - " + buyCntr + ", buyOpnPrice - " + buyOpnPrice + ", lotsSumBuy - " + lotsSumBuy + ".");  
      }  
      if (OrderType() == OP_SELL) {
         sellCntr ++;
         sellOpnPrice = OrderOpenPrice();
         lotsSumSell += OrderLots();
         TrailingByShadows(OrderTicket(), Period(), 11, 0);
         LogAdd("Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - " + sellCntr + ", sellOpnPrice - " + sellOpnPrice + ", lotsSumSell - " + lotsSumSell + ".");
      }  
      if (OrderType() == OP_SELLSTOP) {
         sellOpnPrice = OrderOpenPrice();         
         LogAdd("Ордер является отложенным, тип ордера - на продажу, фиксирую цену открытия: sellOpnPrice - " + sellOpnPrice + ".");
      }  
      if (OrderType() == OP_BUYSTOP) {
         buyOpnPrice = OrderOpenPrice();
         LogAdd("Ордер является отложенным, тип ордера - на покупку, фиксирую цену открытия: buyOpnPrice - " + buyOpnPrice + ".");
      }  
   }
   LogAdd("Вычисления переменных для текущего тика завершены."); 

このセクションのための丸太の一片。

2013.10.2 15:59:0 - Начинаю вычисления переменных для текущего тика ... 
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 5
2013.10.2 15:59:0 - Ордер является отложенным, тип ордера - на продажу, фиксирую цену открытия: sellOpnPrice - 1.35250000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 4
2013.10.2 15:59:0 - Ордер открыт позже предыдущего, не является отложенным. Записываю переменные: opnTime - 1380728738, currentTicket - 93537240, currentStopLoss - 0.00000000.
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - 1, buyOpnPrice - 1.35620000, lotsSumBuy - 0.06000000.
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 1, sellOpnPrice - 1.35250000, lotsSumSell - 0.01000000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 3
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 2, sellOpnPrice - 1.35250000, lotsSumSell - 0.04000000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 2
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - 2, buyOpnPrice - 1.35620000, lotsSumBuy - 0.07000000.
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 3, sellOpnPrice - 1.35250000, lotsSumSell - 0.05000000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 1
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - 3, buyOpnPrice - 1.35620000, lotsSumBuy - 0.08000000.
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 4, sellOpnPrice - 1.35250000, lotsSumSell - 0.06000000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 0
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 5, sellOpnPrice - 1.35250000, lotsSumSell - 0.07000000.
2013.10.2 15:59:0 - Вычисления переменных для текущего тика завершены.
問題は、同じ注文に対して、どのような条件が成立したかということだ。
      if (OrderType() == OP_BUY) {         
          ...
      }  
      if (OrderType() == OP_SELL) {
          ...
      } 

何かよくわからないけど、でも論理的に考えると、この順番の場合はこうだということがわかる。

OP_BUY == OP_SELL
基本的に私はこれが起こる理由を気にしない、重要なのはsellCntr + +とbuyCntr +は、特定のタイプのオープンオーダーのために一義的に実行されることです、私はそれを修正するのに役立ちます?
 
Mepkypuu:

MQL4プログラミングの達人たちよ、こんにちは。どうすれば可能なのか、アドバイスをお願いします。

プログラムコードの一部。

このセクションのための丸太の一片。

問題は、同じ注文に対して、どのような 条件が成立したかということだ。

何か よくわからないけど、でも論理的に考えると、この順番の場合はこうだということがわかる。

基本的に私はこれが起こる理由を気にしない、重要なのはsellCntr + +とbuyCntr +は、特定のタイプのオープンオーダーのために一義的に実行されることです、私を修正するのに役立ちます?
なぜ同じ順番だとわかるのですか?チケットは印刷しないんですね ;)...。私は確信しています: トラウリングのとき、注文のオーバーフローがあります;)- 誘発されたエラーはそこからです。
TrailingByShadows(OrderTicket(), Period(), 11, 0);  ?????????????????????????????? Вы при трале разве ордера не перебираете ?????????? 
 
VladislavVG:
なぜ同じ順番だと言い切れるのでしょうか?チケットは印刷しないんですね ;)...。きっと: トロールすると、オーダーがオーバーサンプリングされる ;)- 誘発されたエラーはそこからです。

論理的には、すでに具体的にどのオーダーをトロールする必要があるのかが分かっているのに、なぜトロールでオーダーを調べていくのでしょうか?ブルートフォースはありません、以下がそのコードです。

void TrailingByShadows(int ticket,int tmfrm,int bars_n, int indent) {  
   int i;
   double new_extremum;

   if ((bars_n<1) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET))) {
      Print("Трейлинг функцией TrailingByShadows() невозможен из-за некорректности значений переданных ей аргументов.");
      return(0);
   } 
   if (OrderType()==OP_BUY) {
      for(i = 1; i <= bars_n; i++) {
         if (i == 1) new_extremum = iLow(Symbol(), tmfrm, i); 
         else if (new_extremum > iLow(Symbol(), tmfrm, i)) new_extremum = iLow(Symbol(), tmfrm, i);
      }
      if(((new_extremum - indent * Point) > OrderStopLoss() + 1.0 * Point) || (OrderStopLoss() == 0))
      if((new_extremum - indent * Point) > OrderOpenPrice())
      if(new_extremum - indent * Point < Bid - MarketInfo(Symbol(), MODE_STOPLEVEL) * Point)
      if(AcountProfitEx(new_extremum) > ProfitSize)
      OrderModify(ticket, OrderOpenPrice(), new_extremum - indent * Point, OrderTakeProfit(), OrderExpiration());
   }
   
   if (OrderType() == OP_SELL) {
      for(i = 1; i <= bars_n; i++) {
         if (i == 1) new_extremum = iHigh(Symbol(), tmfrm, i); 
         else if (new_extremum < iHigh(Symbol(), tmfrm, i)) new_extremum = iHigh(Symbol(), tmfrm, i);
      }
      if (((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD)) * Point) < OrderStopLoss() - 1.0 * Point) || (OrderStopLoss() == 0)) 
      if ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD)) * Point) < OrderOpenPrice())                          
      if ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD)) * Point > Ask + MarketInfo(Symbol(),MODE_STOPLEVEL) * Point)) 
      if (AcountProfitEx(new_extremum) > ProfitSize)
      OrderModify(ticket, OrderOpenPrice(), new_extremum + (indent + MarketInfo(Symbol(), MODE_SPREAD)) * Point, OrderTakeProfit(), OrderExpiration());
   }      
}
追記:ちなみに、この問題は実際の条件下でのみ発生し、つまりテスターでは再現されません。
 
プログラマーの皆様、パソコンを再度再起動した際、通常のチャートの代わりにターミナルを開くとグレーのウィンドウが表示され、オープンポジション、EA、インディケータが失われました。しかし、新しいチャートを開くとポジションは表示されますが、EAとインディケータがなく、再度インストールしなければならなかったのはなぜですか?これと何の関係があるんだ?また取り付けることになりました。 ありがとうございました。
 

そんな問題が生じている。ストラテジーテスターは 一度しか使えません。より正確には、ビジュアライゼーションテストが一度発動され、次に「スタート」ボタンを押すと、「ビジュアライゼーション」チェックボックスはリセットされ、何も起きません(sort of doesn't happen)。これをどうすれば打ち破れるのか。

 
Mepkypuu:

論理的には、すでに具体的にどのオーダーをトロールする必要があるのかが分かっているのに、なぜトロールでオーダーを調べていくのでしょうか?ブルートフォースはありません、コードはこちらです。

追記:ちなみに、この問題は実際の条件下でのみ発生し、つまりテスターでは再現されません。


このバリアントで動かしてみてください。

   LogAdd("Начинаю вычисления переменных для текущего тика ... ");  
   for (int i = OrdersTotal()-1; i >= 0; i--) 
   {
      if(!OrderSelect(i, SELECT_BY_POS)) continue;           
      int OrdType=OrderType() ;
      int OrdTckt = OrderTicket(); 
      LogAdd("Выбираю ордер ( "+i+" ) с тикетом: " + OrdTckt); 
      if ((OrderOpenTime() > opnTime) && (OrdType == OP_BUY) || (OrdType == OP_SELL)) {    
         opnTime = OrderOpenTime();
         currentTicket = OrderTicket(); 
         currentStopLoss = OrderStopLoss();          
         LogAdd("Ордер открыт позже предыдущего, не является отложенным. Записываю переменные: opnTime - " + opnTime + ", currentTicket - " + currentTicket + ", currentStopLoss - " + currentStopLoss + ".");
      }
      if (OrdType == OP_BUY) 
      {         
         buyCntr ++;   
         buyOpnPrice = OrderOpenPrice();
         lotsSumBuy += OrderLots();
         TrailingByShadows(OrderTicket(), Period(), 11, 0); 
         LogAdd("Ордер "+OrdTckt  <-> OrderTicket()+" не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - " + buyCntr + ", buyOpnPrice - " + buyOpnPrice + ", lotsSumBuy - " + lotsSumBuy + ".");  
      }  
      if (OrdType== OP_SELL) 
      {
         sellCntr ++;
         sellOpnPrice = OrderOpenPrice();
         lotsSumSell += OrderLots();
         TrailingByShadows(OrderTicket(), Period(), 11, 0);
         LogAdd("Ордер "+OrdTckt  <-> OrderTicket()+" не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - " + sellCntr + ", sellOpnPrice - " + sellOpnPrice + ", lotsSumSell - " + lotsSumSell + ".");
      }  
      if (OrderType() == OP_SELLSTOP) 
      {
         sellOpnPrice = OrderOpenPrice();         
         LogAdd("Ордер "+OrdTckt  <-> OrderTicket()+" является отложенным, тип ордера - на продажу, фиксирую цену открытия: sellOpnPrice - " + sellOpnPrice + ".");
      }  
      if (OrderType() == OP_BUYSTOP) 
      {
         buyOpnPrice = OrderOpenPrice();
         LogAdd("Ордер "+OrdTckt  <-> OrderTicket()+" является отложенным, тип ордера - на покупку, фиксирую цену открытия: buyOpnPrice - " + buyOpnPrice + ".");
      }  
   }
   LogAdd("Вычисления переменных для текущего тика завершены."); 

ログをご覧ください。

 
テンプレートではなく、プログラムでインデントを設定することは可能でしょうか?でインデントサイズを取得できます。
WindowBarsPerChart() - WindowFirstVisibleBar() - 2;

できるのですが、それをどのように露出させるか。

追加

テンプレートでプログラム的にできるようです。インジケータでテンプレートを作成し、_lread kernel32.dllで shift_size値を読み込み、 _lwriteで10から50までの数をそこに書き込み、そのような範囲は、このパラメータを受け入れることができるように、次にInternalMsgを介してテンプレートを読み込みます。しかし、それが33511なのか35511なのかはわからない。WinUser32.mqhでは、最初の選択肢ですが、フォーラムでは、2番目の選択肢になっています。その質問は、純子さん宛のものでなければならない。MT5では、CHART_SHIFT_SIZEは 、ChartSetString() ChartGetString()によって、コード内のどの場所からでも利用可能です。MT4には他のオプションがあるのでは?バカな質問ですが...。