Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 411

 
Leanid Aladzyeu :

Diziler hakkında bilgi edinmeye başladı.

3 dizi = 0 alış, 1= sat, 2= toplam alım satım işlemleri ile emirler hakkında bir fonksiyon yazdım.

Sonra satın alma koşulunda if ( ilk koşul && array [0] == 0 ) yazdım, sonra satın almayı aç

ve satılıksa (ilk koşul && dizisi [1]==0) satışa açılırsa.

Ama test cihazında hata veriyor ve test duruyor, sorun ne? ("dizi dışı" hatası)

Bu nedenle, erişmekte olduğunuz dizin, dizi işaretlemesinin dışındadır. Örneğin, eğer dizi[ 3 ]; o zaman yalnızca 0'dan 2'ye kadar olan öğelere erişebilirsiniz. Kodunuzu kontrol edin.

Ayrıca diziyi işaretlememiş olabilirsiniz ( ArrayResize() kullanarak), ancak bazı öğelerine başvurmaya çalışıyorsunuz.

 
kod..
 void Oher( int Mag, string Symb, int &mas[ 2 ])
{
ArrayInitialize ( mas, 0 );

int tip;
int ticket3 =- 1 ;
   for ( int pos= OrdersTotal ()- 1 ; pos>= 0 ; pos--)
     {
     if ( OrderSelect (pos,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Mag && OrderSymbol()==Symb && OrderTicket()!=ticket3)
          {
          ticket3=OrderTicket();
          tip=OrderType();
          
           switch (tip)
              {
               case 0 :mas[ 0 ]++; mas [ 2 ]++; break ; // 0 покупка
               case 1 :mas[ 1 ]++; mas [ 2 ]++; break ; // 1 продажа
              }
          }
           continue ;
     }

}
Чудо код вставил ) 2 раз получилось за все время что я на сайте)
 
Leanid Aladzyeu :
kod..
Kendiniz anlamaya çalışın, test cihazı, hatanın hangi satırda ve satırda meydana geldiğini belirtmelidir.
 
Tapochun :
Kendiniz anlamaya çalışın, test cihazı, hatanın hangi satırda ve satırda meydana geldiğini belirtmelidir.

O_o ATP başka ne olduğunu bilmiyordu ve terminal hatanın nerede olduğunu dürttü, ilk defa kritik bir hatayla karşılaştım.

   case 1 :mas[ 1 ]++; mas [ 2 ]++; break ; // 1 продажа

ona tükürmek.

 
Düzeltildi. sadece 2 dizi vardı ve dizinin başlatılmasında ve fonksiyonda 3'e ihtiyacım vardı, sayı +1 yaptı. ve kazanılan)
 

Gösterge kontrolünü nasıl uygulayacağımı söyle.

Sonuç şudur: danışman, yeni bir çubuk oluşturulduğunda, göstergeye atıfta bulunur ve şu anda göstergenin henüz verisi yoktur ve önceki çubuğun verilerini alıyorum. henüz hesapla)

Bu pusu nasıl atlanır. Ve test cihazında her şey yolunda. Demoda sorun yok, değil!

Hepsi alakasız. Karar verildi.

 

Merhaba, yeni başlayanlar için bir problemim var ...

Sistemi belirli bir süre için son çubuğun kapanış değerini yüksek ve düşük değerlerle karşılaştırmaya zorlayamam, örneğin

son 20 bar. Neyi yanlış yapıyorum?

 extern int     MAGIC             = 90324752;
extern int     START_HOUR        = 7;
extern int     FINISH_HOUR       = 18;
extern int     TRADE_LIMIT       = 3;
extern int     SMMA_PERIOD       = 100;
extern int     BB_PERIOD         = 50;
extern double  BB_DEV            = 1;
extern double  LOT               = 1;
extern double  StopLoss          = 400;
extern double  TakeProfit        = 2000;

void OnTick()
{
static int    TICKET;

double SMMA                 = iMA (Symbol(),0,SMMA_PERIOD,0,MODE_SMMA,PRICE_CLOSE,0);
double BB_UP                = iBands(Symbol(),0,BB_PERIOD,BB_DEV,0,PRICE_CLOSE,MODE_UPPER,0);       

double HIGHEST              = High[iHighest( Symbol (), 0 ,MODE_HIGH, 20 , 0 )];

if(Hour() >= START_HOUR && Hour() <= FINISH_HOUR && TRADE_COUNT < TRADE_LIMIT && POS_OPENED == FALSE && Seconds() >= 55 )
if(Minute() == 29 || Minute() == 59)
{     
  if(Close[0] > SMMA && Close[0] > BB_UP && Close[ 0 ] >= HIGHEST )

  {
   TICKET = OrderSend ( Symbol (),OP_BUY,LOT,Ask, 0 ,Ask-StopLoss* Point ,Ask+TakeProfit* Point , NULL ,MAGIC, 0 ,Blue);
   if(TICKET < 0)
      {
         Alert("Order Send failed, error # ", GetLastError() );
      } 
  }
}
}


Alert üzerinden kontrol ettim ve anlamadığım nedenlerden dolayı test cihazı en son tikten itibaren hesaplamadan maksimum değeri veriyor ama bu değeri veriyor

keneler olduğu kadar, sipariş açılmaz.


Ve ikinci sorun, EA'nın bir sonraki bar açılana kadar (30m periyodu) nasıl bekletileceğidir? Kontrol noktalarıyla test ederken her şey yolundadır, ancak keneler varsa,

daha sonra danışman, stop loss ile kapandığı yerde hemen aynı çubukta açılır, örneğin...


Bir kene olup olmadığına bakılmaksızın bir ticareti nasıl kapatabilirsiniz? örneğin, 30m'lik bir periyotta, çubuğun bitiminden 5 saniye önce siparişi kapatmak istiyorum (29.55, 59.55)

o andaki tüm verilere dayanarak. Bu aşamada sorun şu ki, 5 saniye içinde bir kene oluşmazsa, bu nedenle oluşmaz.

mantıksal işlem yok, sinyal alınmadı ve bir sonraki sinyale kadar an kaçırıldı :( teoride, çöp, ama gerçekte test cihazında bir sonraki sinyal olabilir

nedense birkaç mumdan sonra bile ortaya çıkıyor.


Şimdiden teşekkürler!
 

Yorumlarla yardım edin. Her çubukta yorumlar oluşturulur. Her onayda, mevcut yoruma daha fazla metin eklemek istiyorum.

Kodu çağırıyorum:

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

Yeni bir yorum ekler ve yeni bir satırdaki her onay işareti için metin aşağı kayar.

Çıktı almadan önce son birkaç satırı silmesini nasıl sağlayabilirim?

 
ForTorg ZEVs :

Yorumlarla yardım edin. Her çubukta yorumlar oluşturulur. Her onayda, mevcut yoruma daha fazla metin eklemek istiyorum.

Kodu çağırıyorum:

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

Yeni bir yorum ekler ve yeni bir satırdaki her onay işareti için metin aşağı kayar.

Çıktı almadan önce son birkaç satırı silmesini nasıl sağlayabilirim?

Bana öyle geliyor ki, Yorumu () yalnızca tamamen değiştirebilirsiniz.

Ve buna göre, her bir tik üzerindeki yorumun bir kısmını değiştirmek için, her tik üzerindeki yorumu tamamen değiştirmeniz gerekir.

 
ForTorg ZEVs :

Yorumlarla yardım edin. Her çubukta yorumlar oluşturulur. Her onayda, mevcut yoruma daha fazla metin eklemek istiyorum.

Kodu çağırıyorum:

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

Yeni bir yorum ekler ve yeni bir satırdaki her onay işareti için metin aşağı kayar.

Çıktı almadan önce son birkaç satırı silmesini nasıl sağlayabilirim?

Yani yorumunuzda "\n" kontrol karakterine sahipsiniz - bu satır besleme karakteridir. Kaldırırsanız, çoklu satır olmaz.