Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 168

 

Lütfen bana neyi yanlış yaptığımı söyle. Basit bir gösterge yapmaya çalışıyorum:


  {

   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 );
  }
//+------------------------------------------------------------------+

Grafik penceresinde çalışır, danışmanda test etmeye çalıştığınızda ya bir şey çizer ya da "adım yok"

 
Virtuon :

Lütfen bana neyi yanlış yaptığımı söyle. Basit bir gösterge yapmaya çalışıyorum:

Grafik penceresinde çalışır, danışmanda test etmeye çalıştığınızda ya bir şey çizer ya da "adım yok"

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

Sınanmış. Bu sürümde, sadece pencerede bile çalışmıyor. Belli ki burada bir hile var. Şimdi bu sürümde çalışıyor, ancak çok yavaş:
 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 ]);
   }
Bu, devre dışı bırakılan son çubuğun yeniden hesaplanması için yapılan kontrolle birliktedir.
 

Merhaba, MQL4 programlama guruları! Lütfen bana bunun nasıl mümkün olduğunu söyleyin:

Program kodu parçacığı:

   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( "Вычисления переменных для текущего тика завершены." ); 

Bu bölüm için günlüğün bir parçası:

 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 - Вычисления переменных для текущего тика завершены.
Soru, koşulların aynı sipariş için nasıl çalışabileceğidir:
       if (OrderType() == OP_BUY) {         
          ...
      }  
       if (OrderType() == OP_SELL) {
          ...
      } 

Mb Bir şey anlamıyorum, ama sonra, mantıklı olarak, bu sipariş için ortaya çıkıyor:

OP_BUY == OP_SELL
Prensip olarak, bunun neden olduğu benim için önemli değil, sellCntr++ ve buyCntr++'ın belirli bir açık sipariş türü için açık bir şekilde yürütülmesi önemlidir, düzeltmeme yardım edin?
 
Mepkypuu :

Merhaba, MQL4 programlama guruları! Lütfen bana bunun nasıl mümkün olduğunu söyleyin:

Program kodu parçacığı:

Bu bölüm için günlüğün bir parçası:

Soru, koşulların aynı sipariş için nasıl çalışabileceğidir :

Mb Bir şey anlamıyorum , ama sonra, mantıksal olarak, bu sipariş için ortaya çıktı:

Prensip olarak, bunun neden olduğu benim için önemli değil, sellCntr++ ve buyCntr++'ın belirli bir açık sipariş türü için açık bir şekilde yürütülmesi önemlidir, düzeltmeme yardım edin?
Bunun aynı düzen olduğundan nasıl emin olabiliyorsunuz? Bilet yazdırmıyorsunuz ;).... Eminim: takip ederken, sipariş araması vardır ;) - oradan kaynaklanan bir hata.
 TrailingByShadows(OrderTicket(), Period (), 11 , 0 );  ?????????????????????????????? Вы при трале разве ордера не перебираете ?????????? 
 
VladislavVG :
Bunun aynı düzen olduğundan nasıl emin olabiliyorsunuz? Bilet yazdırmıyorsunuz ;).... Eminim: takip ederken, sipariş araması vardır ;) - oradan kaynaklanan bir hata.

Şeylerin mantığına göre: hangi belirli sırayı izlemem gerektiğini zaten biliyorsam neden izdeki siparişleri sıralamalıyım? Kaba kuvvet yoktur, işte kod:

 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());
   }      
}
Not: Bu arada, bu sorun yalnızca gerçek koşullarda, yani. test cihazında çalışmıyor.
 
Sevgili programcılar, lütfen bir dahaki sefere bilgisayarınızı yeniden başlattığınızda, terminali açtığınızda, normal bir tablo yerine gri bir pencerenin göründüğünü, açık pozisyonlar , danışman, göstergelerin kaybolduğunu ve yeni bir tablo aradığınızda pozisyonların göründüğünü söyleyin. , ancak danışman ve gösterge yok, onları yeniden kurmak zorunda kaldım. Neyle bağlantılı? Teşekkür ederim.
 

Böyle bir sorun ortaya çıktı. Strateji test cihazı yalnızca bir kez çalışır. Daha doğrusu, test görselleştirmesi bir kez çalışır ve bir dahaki sefere "başlat" düğmesine tıkladığınızda, "görselleştirme" onay kutusu sıfırlanır ve hiçbir şey olmaz (hiçbir şey olmamış gibi). Nasıl kazanılır?

 
Mepkypuu :

Şeylerin mantığına göre: hangi belirli sırayı izlemem gerektiğini zaten biliyorsam neden izdeki siparişleri sıralamalıyım? Kaba kuvvet yoktur, işte kod:

Not: Bu arada, bu sorun yalnızca gerçek koşullarda, yani. test cihazında çalışmıyor.


Şu şekilde çalıştırmayı deneyin:

   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( "Вычисления переменных для текущего тика завершены." ); 

Günlüklere ne yazılacağını görün.

 
Girintiyi şablon aracılığıyla değil, programlı olarak ayarlamak mümkün müdür? aracılığıyla bazı girinti boyutu alın
WindowBarsPerChart() - WindowFirstVisibleBar() - 2 ;

yapabilirsin, ama nasıl olduğunu göster.

Katma

Programlı olarak şablonlar aracılığıyla mümkün görünüyor. Hindi ile bir şablon oluşturuyoruz, _lread kernel32.dll kullanarak shift_size değerini okuyoruz, kullanarak _lwrite , oraya 10'dan 50'ye kadar bir sayı yazıyoruz, görünen o ki bu parametre bu kadar aralıklar alabiliyor, sonra InternalMsg üzerinden şablonu yüklüyoruz. 33511 mi yoksa 35511 mi olduğu belli değil. WinUser32.mqh ilk seçeneğe sahip, ancak ikincisi forumun her yerinde. Soru muhtemelen Zhunko'ya. MT5'te kıyaslanamayacak kadar kolay, CHART_SHIFT_SIZE orada ChartSetString() ve ChartGetString() aracılığıyla kodun herhangi bir yerinden erişilebilir... Belki MT4'te başka seçenekler de vardır? Aptalca bir soru olsa da...

Neden: