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

 

Bir testçi için

 OrderSend

hızlı sunucularda gidecek ve hatta çalışacak, ancak bir testçi değilse, belgelere göre yapmak daha iyidir :)

 
Beyler, yardıma ihtiyacım var, birkaç gün boyunca aşağıdaki kodda gerekli değişiklikleri yapamıyorum:
 void start()
{
   StopLevel = MarketInfo( Symbol (), MODE_STOPLEVEL); 
   
   // Определение направления пересечения мувингов
   if (Init) InitMetod(); 
   
   // Трейлинг стоп открытых позиций
   if (Trailing != 0 ) RealTrailOrder(TrailStop, TrailStep, StopLevel, MagicNumber);
   
   // Ожидание нового бара на графике
   if (timeprev == Time[ 0 ]) return ;
   timeprev = Time[ 0 ];
   
   // Открытие ордера по методу Пуриа
   CheckForOpen();
}
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen() // Открытие ордера по методу Пуриа
{
   double malw,mas1,mas2,macd;
   int     res;  
   // Считывание параметров индикаторов
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 0 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 0 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 0 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 0 );
  
   // Проверяем положение мувмнгов
   if (malw>mas1 && malw>mas2  && OrderSell)
     {
     OrderBuy= true ;
     OrderSell= false ;
     Order= true ;
     }
   
   if (malw<mas1 && malw<mas2  && OrderBuy)
     {
     OrderBuy= false ;
     OrderSell= true ;
     Order= true ;
     }

   // Открываем ордер Buy
   if (macd> 0 && OrderBuy && Order)
     {
     res= OrderSend ( Symbol (),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss* Point ,Ask+TakeProfit* Point , "" ,MagicNumber, 0 ,Blue);
     Order= false ;
     return ;
     }     
   // Открываем ордер Sell   
   if (macd< 0 && OrderSell && Order)
     {
     res= OrderSend ( Symbol (),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss* Point ,Bid-TakeProfit* Point , "" ,MagicNumber, 0 ,Red);
     Order= false ;
     return ;
     }
 
}  
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lots()   // Расчет объема лота
{
   double Lots;
   if (Lot > 0 ) return (Lot);
   Lots=AccountFreeMargin()/ 5000 ;
   Lots= MathMin ( 15 , MathMax ( 0.01 ,Lots));
   if (Lots< 0.1 ) Lots= NormalizeDouble (Lots, 2 );
   else 
     {
     if (Lots< 1 ) Lots= NormalizeDouble (Lots, 1 );
     else        Lots= NormalizeDouble (Lots, 0 );
     }
   return (Lots);
}
//+------------------------------------------------------------------+
//| Init metod Puria function                                        |
//+------------------------------------------------------------------+
void InitMetod()   // Опредеоение начального пересечения мувингов
{
   double malw,mas1,mas2;
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 0 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 0 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 0 );

   if ((malw<=mas1 && malw>=mas2) || (malw>=mas1 && malw<=mas2))
     {
     Init= false ;
     OrderBuy= true ;
     OrderSell= true ;
     }   
   return;
}

Aslında, denediğim ama buraya ekleyemediğim şey: göstergeler için tüm koşullar eşleştikten sonra (mumların açılış fiyatlarında ), danışman mumların 4 açılış fiyatını arka arkaya bekleyecek şekilde yapın :


  1. 1. 1. mumun açılış fiyatı - (5) (75) ve (85) üstü + MACD çubuğu 0'ın üzerinde açıldı - 4 teyitten 1'i var ;
    2. 2. mumun açılış fiyatı - (5) (75) ve (85) + 0 üzerinde açılan MACD çubuğu -   4 onaydan 2'si ;
    3. 3. mumun açılış fiyatı - (5) (75) ve (85) + 0 üzerinde açılan MACD çubuğu -   4 onaydan 3'ü ;
    4. 4. mumun açılış fiyatı - (5) (75) ve (85) + 0 üzerinde açılan MACD çubuğu -   4 onaydan 4'ü   -   Aynı mumu satın almak için bir anlaşma açmak (4.).

Siparişler için benzer bir durum   sat , sadece göstergeler diğer yönde açılmalıdır. Ve önemli bir nokta var - diyelim ki, 1. mumdan 4. muma kadar herhangi bir aşamada,   göstergeler konumlarını değiştirecek   (örneğin, 3. açılış mumunda, MACD çubuğu ya 0'ın altında ya da = 0'ın altında açılacaktır - o zaman her şey sıfırlanır çünkü. sinyaller arka arkaya 4 mum açma testini geçemedi .

Söyleyin bana pliz, deneyimli programcılar, bu koşulların karşılanması için kodda nelerin değiştirilmesi gerekiyor? Sonra bir çok şey denedim ve genel olarak xs ...

 
   if (malw>mas1 && malw>mas2  && OrderSell)

Söylediği gibi, bunu yüz değerinde almayın.

 OrderSell

xs içinde ne olabilir, koddaki karar verme mantığını ayırın.

 

artem artem # :

1. 1. mumun açılış fiyatı - (5) (75) ve (85) üstü + MACD çubuğu 0'ın üzerinde açıldı - 4 teyitten 1'i var ;

2. 2. mumun açılış fiyatı - (5) (75) ve (85) + 0 üzerinde açılan MACD çubuğu -   4 onaydan 2'si ;

3. 3. mumun açılış fiyatı - (5) (75) ve (85) + 0 üzerinde açılan MACD çubuğu -   4 onaydan 3'ü ;

4. 4. mumun açılış fiyatı - (5) (75) ve (85) + 0 üzerinde açılan MACD çubuğu -   4 onaydan 4'ü   -   Aynı mumu satın almak için bir anlaşma açmak (4.).

     //+------------------------------------------------------------------+
    //| Expert tick function                                             |
    //+------------------------------------------------------------------+
    void OnTick ()
      {
    //---
       if (CheckForOpen()== 0 )
         {
           if ( OrderSend ( Symbol (),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss* Point ,Ask+TakeProfit* Point , "" ,MagicNumber, 0 ,Blue)) Print ( "BUY OK" );
         }
       if (CheckForOpen()== 1 )
         {
           if ( OrderSend ( Symbol (),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss* Point ,Bid-TakeProfit* Point , "" ,MagicNumber, 0 ,Red)) Print ( "SELL OK" );
         }
      }
    //+------------------------------------------------------------------+
    //| Check for open order conditions                                  |
    //+------------------------------------------------------------------+
    int CheckForOpen() // Открытие ордера по методу Пуриа
      {
       double malw,mas1,mas2,macd;
       int     res=- 1 , buy= 0 , sell= 0 ;
       // Считывание параметров индикаторов 3 свечи
       malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 3 );
       mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 3 );
       mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 3 );
       macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 3 );
       if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
       if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
       // Считывание параметров индикаторов 2 свечи
       malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 2 );
       mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 2 );
       mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 2 );
       macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 2 );
       if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
       if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
       // Считывание параметров индикаторов 1 свечи
       malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 1 );
       mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 1 );
       mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 1 );
       macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 1 );
       if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
       if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
       // Считывание параметров индикаторов 0 свечи
       malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 0 );
       mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 0 );
       mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 0 );
       macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 0 );
       if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
       if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
       
       if (buy == 4 ) res= 0 ;
       if (sell== 4 ) res= 1 ;
       return (res);
      }
     
    malw

    Çekiçler bir değer - başka bir şey, hiçbir şey? Birinci blok = çözüm, ikinci blok = çözüm bölün, blokları karşılaştırın.

     
    Volodymyr Zubov # :

    Çekiçler bir değer - başka bir şey, hiçbir şey? Birinci blok = çözüm, ikinci blok = çözüm bölün, blokları karşılaştırın.

    Kime yazılır? ya da neye?
     
    Size çıkıyor, kodda
    malw
    ve mantıksal bir hata var.
     
    Volodymyr Zubov # :
    Kodda mantıksal bir hata olduğu ortaya çıktı ve işte gidiyor.
    Göndermeden önce kontrol edin
     

    tamam, ama eğer onları böyle kullanırsan değişkenler çökecek ve o zaman “mucizelerin” ne olduğunu anlamayacaksın.

     
    Volodymyr Zubov # :

    tamam, ama eğer onları böyle kullanırsan değişkenler çökecek ve o zaman “mucizelerin” ne olduğunu anlamayacaksın.

    Başka bir seçenek biliyorsanız, yazın ...

    İnsanlara yardımcı ol)