MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 39

 
trader781 :
Bunu nasıl açıklayacağımı bilmiyorum. Ama kesinlikle bir başyapıt.
Burada sokmayı sevdiklerini söylüyorum)) Ve Trishkin hala bundan rahatsız oldu .. Burada yardımcı olacakları bir kod olacağını söyledi ..
 
Movlat Baghiyev :
Burada sokmayı sevdiklerini söylüyorum)) Ve Trishkin hala bundan rahatsız oldu .. Burada yardımcı olacakları bir kod olacağını söyledi ..

Ben de senin gibi acemiyim ama benim bile çok sorum var

for ( int i= 0 ; i< Sipariş Toplamı (); i++)
{
      if ( OrderSelect (i, SELECT_BY_POS )== true )
{
         if ( OrderSymbol ()!= Symbol () || OrderMagicNumber ()!=Sihirli) devam ;
         if ( OrderType ()== OP_BUY || OrderType ()== OP_SELL ) p++;
         if ( OrderType ()== OP_BUYSTOP )
              if (bue_signal) OrderDelete ( OrderTicket ());
                  başka b++;
         if ( OrderType ()== OP_SELLSTOP )
              if (sell_signal) OrderDelete ( OrderTicket ());
                  başka s++;
}

}

1) b++'ı nereden buldun

2) s++ ı nereden aldınız

3)   if (signal_bue) bu başka nedir?

ve kodun geri kalanı. Seni kırdıysam özür dilerim.

 
bu muhtemelen daha iyi
//+------------------------------------------------------------------+
//|                                                      ОТЛОЖКИ.mq4 |
//+------------------------------------------------------------------+
extern double StopLoss     = 100 ; //Стоплосс ордера  
extern double TakeProfit   = 150 ; //Тейкпрофит ордера
extern double TrailingStop = 100 ; // трал
extern int     Delta        = 100 ; //Расстояние от цены для установки ордера
extern double LOT          = 0.1 ; //Объём позиции
extern int     Magic        = 2 ;
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   if (TrailingStop!= 0 ) Trailing();
  
   //ИНДИКАТОР RSI
   double RSI0= iRSI ( NULL , 0 , 5 , PRICE_CLOSE , 0 );
   double RSI1= iRSI ( NULL , 0 , 5 , PRICE_CLOSE , 1 );
  
   int b = 0 , s = 0 , p = 0 , res = 0 ;

   double BuyPrice= Ask +Delta* Point ;
   double SellPrice= Bid -Delta* Point ;
  
   for ( int i= 0 ; i< OrdersTotal (); i++)
    {
     if ( OrderSelect (i, SELECT_BY_POS )== true )
      {
         if ( OrderSymbol ()!= Symbol () || OrderMagicNumber ()!=Magic) continue ;
         if ( OrderType ()== OP_BUY || OrderType ()== OP_SELL ) p++;
         if ( OrderType ()== OP_BUYSTOP )
        {
           if (RSI0< 50 &&RSI1> 50 )
                 OrderDelete ( OrderTicket ());
             else
                b++;
        }
         if ( OrderType ()== OP_SELLSTOP )
        {
           if (RSI0> 50 &&RSI1< 50 )
                 OrderDelete ( OrderTicket ());
               else
                s++;
        }
      }
    }

   double SL,TP; // < !!!!!!!!! эти переменные не используются, можно удалить

//---- buy stop
   if (RSI0> 50 &&RSI1< 50 && p< 1 && b< 1 ) // < !!!!!!!!!
     {
      res= OrderSend ( Symbol (), OP_BUYSTOP ,LOT,BuyPrice, 0 ,BuyPrice-StopLoss* Point ,BuyPrice+TakeProfit* Point , "ОТЛОЖКИ" ,Magic, OP_SELLSTOP ,Blue);
     }        
//---- sell stop  
   if (RSI0< 50 &&RSI1> 50 && p< 1 && s< 1 ) // < !!!!!!!!!
     {
      res= OrderSend ( Symbol (), OP_SELLSTOP ,LOT,SellPrice, 0 ,SellPrice+StopLoss* Point ,SellPrice-TakeProfit* Point , "ОТЛОЖКИ" ,Magic, OP_BUYSTOP ,Red);
     }
//----
   return ( 0 );
}
 
Movlat Baghiyev :
Burada sokmayı sevdiklerini söylüyorum)) Ve Trishkin hala bundan rahatsız oldu .. Burada yardımcı olacakları bir kod olacağını söyledi ..

Bu yüzden daha kolay:

void OrderDelete_( int Type)
  {
   for ( int i= 0 ; i< OrdersTotal (); i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS )== true )
        {
         if ( OrderSymbol ()!= Symbol () || OrderMagicNumber ()!=Magic) continue ;
         if ( OrderType ()==Type)
             OrderDelete ( OrderTicket ());
        }
     }
  }

Bu, geçersiz OnTick() işlevinin dışında bir yerdedir.

if (сигнал_bue) OrderDelete_( OP_SELLSTOP );

if (сигнал_sell)OrderDelete_( OP_BUYSTOP );

Ve bu, void OnTick() işlevinin gövdesindedir.

 
Alekseu Fedotov :


Ve bu, void OnTick() işlevinin gövdesindedir.

Lütfen kodda düzeltmeler yapın
 
trader781 :

TAMAM.

Elinden geleni yapmış gibi görünüyor. Açıklama yapıldı. Amaç, neden istediğiniz gibi çalışmadığını anlamaktır.

if () bloğunun içinde başka bir INSIDE var. Böyle mi olacaktı???

Daha ileri. Başlatılmamış genel değişken sayısı, yine işlevin kendisinde bildirilen Counts() işlevine iletilir.

Counts() işlevi siparişleri yeniden hesaplar, ancak bunları ana işlevde birkaç kez değişen bazı biletlerle karşılaştırır. Ancak, fonksiyonun tetiklendiği anda biletin değeri aynıdır. Peki fonksiyon kaç sipariş sayacak? Gerçekten birden fazla mı?

Bu formdaki bu fonksiyon argümanlara ihtiyaç duymaz, sadece çağırın ve sonucu döndürmesine izin verin.

Daha ileri. FindLastOType() işlevi yine bir biletle karşılaştırmadır. Doğru biletle karşılaştırılacağını garanti edebilir misiniz? Gerekli sihir ve sembole sahip ilk sipariş bulunduğunda döngüyü kırmak ve ardından sipariş türünü döndürmek daha kolay olmaz mıydı?

FindLastOrderOpenPrice() ve FindLastLot() ile aynı.

ModifyOrders() işlevi beni o kadar korkuttu ki geceleri kabus görmeden uyumak için uzun süre bakmadım...

 
Movlat Baghiyev :
Lütfen kodda düzeltmeler yapın

^_~ deneyin

extern double StopLoss     = 100 ; //Стоплосс ордера  
extern double TakeProfit   = 150 ; //Тейкпрофит ордера
extern double TrailingStop = 100 ; // трал
extern int     Delta        = 100 ; //Расстояние от цены для установки ордера
extern double LOT          = 0.1 ; //Объём позиции
extern int     Magic        = 2 ;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- create timer


//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer


  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
  
   int   res = 0 ;

//ИНДИКАТОР RSI
   double RSI0= iRSI ( NULL , 0 , 5 , PRICE_CLOSE , 0 );
   double RSI1= iRSI ( NULL , 0 , 5 , PRICE_CLOSE , 1 );

   double BuyPrice= Ask +Delta* Point ;
   double SellPrice= Bid -Delta* Point ;
  
//---- buy stop
   if (RSI0> 50 &&RSI1< 50 && Number( OP_BUYSTOP )< 0 && Number( OP_BUY )< 1 ) // < !!!!!!!!!
     {
      res= OrderSend ( Symbol (), OP_BUYSTOP ,LOT,BuyPrice, 0 ,BuyPrice-StopLoss* Point ,BuyPrice+TakeProfit* Point , "ОТЛОЖКИ" ,Magic, OP_SELLSTOP ,Blue);
     }        
//---- sell stop  
   if (RSI0< 50 &&RSI1> 50 && Number( OP_SELLSTOP )< 0 && Number( OP_SELL )< 1 ) // < !!!!!!!!!
     {
      res= OrderSend ( Symbol (), OP_SELLSTOP ,LOT,SellPrice, 0 ,SellPrice+StopLoss* Point ,SellPrice-TakeProfit* Point , "ОТЛОЖКИ" ,Magic, OP_BUYSTOP ,Red);
     }
//----  
  
  
if (RSI0> 50 &&RSI1< 50 ) OrderDelete_( OP_SELLSTOP );

if (RSI0< 50 &&RSI1> 50 )OrderDelete_( OP_BUYSTOP );

  }

//+------------------------------------------------------------------+
void OrderDelete_( int Type)
  {
   bool   r;
   for ( int i= 0 ; i< OrdersTotal (); i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS )== true )
        {
         if ( OrderSymbol ()!= Symbol () || OrderMagicNumber ()!=Magic) continue ;
         if ( OrderType ()==Type)
          r = OrderDelete ( OrderTicket ());
        }
     }
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Number( int Type)
  {
   int kp= 0 ;
   for ( int i= 0 ; i< OrdersTotal (); i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS )== true )
        {
         if ( OrderSymbol ()!= Symbol () || OrderMagicNumber ()!=Magic) continue ;
         if ( OrderType ()==Type)
            kp++;
        }
     }
   return (kp);  
  }
//+------------------------------------------------------------------+
 
Alekseu Fedotov teşekkürler, Tanrı sizi korusun..
 
Vitalie Postolache :

if () bloğunun içinde başka bir INSIDE var. Böyle mi olacaktı???

Daha ileri. Başlatılmamış genel değişken sayısı, yine işlevin kendisinde bildirilen Counts() işlevine iletilir.

Counts() işlevi siparişleri yeniden hesaplar, ancak bunları ana işlevde birkaç kez değişen bazı biletlerle karşılaştırır. Ancak, fonksiyonun tetiklendiği anda biletin değeri aynıdır. Peki fonksiyon kaç sipariş sayacak? Gerçekten birden fazla mı?

Bu formdaki bu fonksiyon argümanlara ihtiyaç duymaz, sadece çağırın ve sonucu döndürmesine izin verin.

Daha ileri. FindLastOType() işlevi yine bir biletle karşılaştırmadır. Doğru biletle karşılaştırılacağını garanti edebilir misiniz? Gerekli sihir ve sembole sahip ilk sipariş bulunduğunda döngüyü kırmak ve ardından sipariş türünü döndürmek daha kolay olmaz mıydı?

FindLastOrderOpenPrice() ve FindLastLot() ile aynı.

ModifyOrders() işlevi beni o kadar korkuttu ki geceleri kabus görmeden uyumak için uzun süre bakmadım...

düzelteceğim

başka bir yere koyamazsın, yanlış parametreler olacak

En güncel olanı dikkate almalı

değiştirmeye çalışacağım

İkincisine gelince, evet) Standart OrderModify() ile idare etmeye çalıştım, ancak bir grup sipariş sürekli ve aynı anda taşınırsa hesap yasaklandı

Eleştiri için teşekkürler.

 
spoiltboy :
Evet, bir braket ile kapatıldı. Sorunun geri kalanı alakalı.

bool condition;

if (condition) {}

eşdeğerdir

if (condition== true ) {}

ve

if (!condition) {}

eşdeğerdir

if (condition== false ) {}

Sadece daha kısa ve daha tanıdık.

Neden: