Yeni başlayanlardan sorular MQL4 MT4 MetaTrader 4 - sayfa 129

 
Test cihazında test etmek için bir sembolü nasıl seçeceğimi söyle
 int OnInit (){ return ( INIT_SUCCEEDED );}
 
Nikolay Gaylis :
Test cihazında test etmek için bir sembolü nasıl seçeceğimi söyle

Mümkün değil. Ayarlarda sadece manuel olarak seçin.

Test cihazında elbette diğer karakterler için veri talep edebilirsiniz, ancak bunun için veri senkronizasyonunu sağlamak için yeterince çalışmanız gerekecek (test cihazı bunu sizin için yapmayacaktır, çünkü varsayılan olarak bir karakterle çalışır). Seçilenden farklı bir sembol üzerinde işlem yapmak genellikle imkansızdır.

Not: Bunların hepsi MT4 içindir. MT5'te durum farklıdır.

 
EA , OnTimer() EventSetTimer (1) içinde çalışır.Birçok onay işaretini özlüyorum. OnTick() olayı bana uymuyor çünkü aynı anda birkaç döviz çiftini analiz ediyorum... Sleep(200) bile sistemi bir döngüde yüklüyor... Ne yapmalıyım?
 

AYRILMAK YASAKTIR!

 
Nikolay Gaylis :
EA , OnTimer() EventSetTimer(1) içinde çalışır.Bir çok tik atlıyorum. OnTick() olayı bana uymuyor çünkü aynı anda birkaç döviz çiftini analiz ediyorum... Sleep(200) bile sistemi bir döngüde yüklüyor... Ne yapmalıyım?

Ayrıca EventSetMillisecondTimer() vardır - bu şekilde OnTimer() yürütme sıklığını azaltabilirsiniz.

 
Vladislav Boyko :

Ayrıca EventSetMillisecondTimer() vardır - bu şekilde OnTimer() yürütme sıklığını azaltabilirsiniz.

Teşekkürler, deneyeceğim...

 

Tünaydın.

Test sırasında vurgulanan alanda "Dizi aralık dışında" mesajı görünür. Derleme yaparken hata vermiyor hatanın özü nedir ve nasıl düzeltebilirim?

double TD_Close=Kapat[1];

for (int i=2; i<=Period_bars; i++)

{

if (ABS_Yüksek<Yüksek[i]) ABS_Yüksek=Yüksek[i];

}

if (TD_Close>ABS_Yüksek)

{

if ( OrdersTotal () <= 1 && newCandle != Zaman[0]) int tiket=OrderSend(Symbol(),OP_BUY,volume,Ask,3,sl,tp,"",magic,0);

else newCandle = Zaman[0];

}

 
Andrey.Sabitov :

Tünaydın.

Test sırasında vurgulanan alanda "Dizi aralık dışında" mesajı görünür. Derleme yaparken hata vermiyor hatanın özü nedir ve nasıl düzeltebilirim?

double TD_Close=Kapat[1];

for (int i=2; i<=Period_bars; i++)

{

if (ABS_Yüksek<Yüksek[i]) ABS_Yüksek=Yüksek[i];

}

if (TD_Close>ABS_Yüksek)

{

if (OrdersTotal () <= 1 && newCandle != Zaman[0]) int tiket=OrderSend(Symbol(),OP_BUY,volume,Ask,3,sl,tp,"",magic,0);

else newCandle = Zaman[0];

}

Dönem_çubukları <= Çubuklar - 1 olmalıdır

 

Tünaydın arkadaşlar! Aşağıdaki sorunu çözmeme yardım edin: Basit bir Expert Advisor yazmaya çalışıyorum ve aşağıdakilerle karşılaştım: SL değeri 0'dan farklı bir şeye ayarlanmışsa, işlemler hiç açılmaz ve TP, TStop ve TrailingStep işlevleri hiç çalışmıyor.

Kodda ne düzeltilmeli?

 //+------------------------------------------------------------------+
//|                                                           MA.mq4 |
//|                                                           Sergey |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright    "Sergey Karev"
#property link          "http://www.mql4.com"
#property description "Moving Average sample expert advisor"
//#property strict

#define MAGICMA   23101987
//--- Inputs
input double Lots              = 0.01 ; // Объем лота
input int     SL                = 0 ;     // Stop Loss
input int     TP                = 0 ;     // Take profit
input int     TStop             = 0 ;     // Пункты
input int     TrailingStep      = 0 ;     // Шаг TS в пунктах
input int     MA_per1           = 5 ;     // MA быстрая
input int     MA_per2           = 55 ;   // MA медленная
input int     Timeframe         = 60 ;   // Таймфрейм 
input double MaximumRisk       = 0.02 ;
input double DecreaseFactor    = 3 ;
input int     MovingShift       = 0 ;     // Cдвиг средней
input int     Shift             = 0 ;     // Сдвиг баров
input int     Magic_number      = 1987 ; // Если Magic = 0, то работает + ручные ордеры


bool          TSProfitOnly      = true ;
int           NumberOfTry       = 5 ;
bool          UseSound          = True ;
string        NameFileSound     = "expert.wav" ;
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders( string symbol)
  {
   int buys= 0 ,sells= 0 ;
//---
   for ( int i= 0 ;i< OrdersTotal ();i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )== false ) break ;
       if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==MAGICMA)
        {
         if ( OrderType ()== OP_BUY )  buys++;
         if ( OrderType ()== OP_SELL ) sells++;
        }
     }
//--- return orders volume
   if (buys> 0 ) return (buys);
   else        return (-sells);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   int     orders= HistoryTotal ();     // history orders total
   int     losses= 0 ;                   // number of losses orders without a break
//--- select lot size
   lot= NormalizeDouble ( AccountFreeMargin ()*MaximumRisk/ 1000.0 , 1 );
//--- calcuulate number of losses orders without a break
   if (DecreaseFactor> 0 )
     {
       for ( int i=orders- 1 ;i>= 0 ;i--)
        {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )== false )
           {
             Print ( "Error in history!" );
             break ;
           }
         if ( OrderSymbol ()!= Symbol () || OrderType ()> OP_SELL )
             continue ;
         //---
         if ( OrderProfit ()> 0 ) break ;
         if ( OrderProfit ()< 0 ) losses++;
        }
       if (losses> 1 )
         lot= NormalizeDouble (lot-lot*losses/DecreaseFactor, 1 );
     }
//--- return lot size
   if (lot< 0.1 ) lot= 0.1 ;
   return (lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double ma1;
   double ma2;
   int     res;
   
//+------------------------------------------------------------------+
//| Приводим SL и TP к единым целым                                  |
//+------------------------------------------------------------------+   
   
   double sl= 0 , tp= 0 ;
   sl= NormalizeDouble (SL* Point (), _Digits );
   tp= NormalizeDouble (TP* Point (), _Digits );
   
//--- go trading only for first tiks of new bar
   if ( Volume [ 0 ]> 1 ) return ;
   
//--- get Moving Average 
   ma1= iMA ( NULL ,         Timeframe,   MA_per1, MovingShift,     MODE_SMMA ,         PRICE_CLOSE ,Shift);
   ma2= iMA ( NULL ,         Timeframe,   MA_per2, MovingShift,     MODE_SMMA ,         PRICE_CLOSE ,Shift);
//         имя символа,  таймфрейм,   период,  сдвиг средней,  метод усреднения, тип цены,   сдвиг

//--- sell conditions
   if (ma1 < ma2) //[1] - номер свечи
     {
      res= OrderSend ( Symbol (), OP_SELL ,Lots, Bid , 3 ,sl,tp, "" ,MAGICMA, 0 ,Red);
       return ;
     }
//--- buy conditions
   if (ma1 > ma2)
     {
      res= OrderSend ( Symbol (), OP_BUY ,Lots, Ask , 3 ,sl,tp, "" ,MAGICMA, 0 ,Blue);
       return ;
     }
//---
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double ma1;
   double ma2;
   
//--- go trading only for first tiks of new bar
   if ( Volume [ 0 ]> 1 ) return ;
//--- get Moving Average 
   ma1= iMA ( NULL ,Timeframe,MA_per1,MovingShift, MODE_SMMA , PRICE_CLOSE ,Shift);
   ma2= iMA ( NULL ,Timeframe,MA_per2,MovingShift, MODE_SMMA , PRICE_CLOSE ,Shift);
//---
   for ( int i= 0 ;i< OrdersTotal ();i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )== false ) break ;
       if ( OrderMagicNumber ()!=MAGICMA || OrderSymbol ()!= Symbol ()) continue ;
       //--- check order type 
       if ( OrderType ()== OP_BUY )
        {
         if (ma1 < ma2)
           {
             if (! OrderClose ( OrderTicket (), OrderLots (), Bid , 3 ,White))
               Print ( "OrderClose error " , GetLastError ());
           }
         break ;
        }
       if ( OrderType ()== OP_SELL )
        {
         if (ma1 > ma2)
           {
             if (! OrderClose ( OrderTicket (), OrderLots (), Ask , 3 ,White))
               Print ( "OrderClose error " , GetLastError ());
           }
         break ;
        }
     }
//---
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick ()
  {
//--- check for history and trading
   if ( Bars < 100 || IsTradeAllowed ()== false )
       return ;
//--- calculate open orders by current symbol
   if (CalculateCurrentOrders( Symbol ())== 0 ) CheckForOpen();
   else                                     CheckForClose();
//+------------------------------------------------------------------+
//| Trailing Stop / Step                                             |
//+------------------------------------------------------------------+

   double tr= 0 , ts= 0 , op= 0 , sl= 0 ,
   ask= NormalizeDouble ( Ask , _Digits ),
   bid= NormalizeDouble ( Bid , _Digits );
   
   tr= NormalizeDouble (TStop* Point (), _Digits );
   ts= NormalizeDouble (TrailingStep* Point (), _Digits ); // Приводим к единым величинам (включая центовые счета)
   
double ma2 = iMA ( NULL ,Timeframe,MA_per2,MovingShift, MODE_SMMA , PRICE_CLOSE ,Shift);
   
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
       if ( OrderSelect (i, SELECT_BY_POS )== true )
      {
         if ( OrderSymbol ()== Symbol ())
         {
             if ( OrderMagicNumber ()==Magic_number) // Если Magic = 0, то работает + ручные ордеры
            {
               op= NormalizeDouble ( OrderOpenPrice (), _Digits );
               sl= NormalizeDouble ( OrderStopLoss (), _Digits );
               
               if ( OrderType ()== OP_BUY )
               {
                   if ((bid-op)>tr)
                   if ((bid-sl)>tr)
                   if ((bid-tr)>ma2)
                   if ( OrderModify ( OrderTicket (), OrderOpenPrice (), NormalizeDouble (ma2, _Digits ), OrderTakeProfit (), 0 , clrGreen )== false )
                   Print ( "Error BUY OrderModify" );
               }
               if ( OrderType ()== OP_SELL )
               {
                   if ((op-ask)>tr)
                   if ((sl-ask)>tr || sl== 0 )
                   if ((ask+tr)<ma2)
                   if ( OrderModify ( OrderTicket (), OrderOpenPrice (), NormalizeDouble (ma2, _Digits ), OrderTakeProfit (), 0 , clrGreen )== false )
                   Print ( "Error SELL OrderModify" );                  
               }
            }
         }
      }
   }
  }
//+----------------------------------------------------------------------+

MQL4: automated forex trading, strategy tester and custom indicators with MetaTrader
MQL4: automated forex trading, strategy tester and custom indicators with MetaTrader
  • www.mql4.com
MQL4: automated forex trading, strategy tester and custom indicators with MetaTrader
 
Sergey_M_K :

Tünaydın arkadaşlar! Aşağıdaki sorunu çözmeme yardım edin: Basit bir Expert Advisor yazmaya çalışıyorum ve aşağıdakilerle karşılaştım: SL değeri 0'dan farklı bir şeye ayarlanmışsa, işlemler hiç açılmaz ve TP, TStop ve TrailingStep işlevleri hiç çalışmıyor.

Kodda ne düzeltilmeli?

Hatalarınızı bulmak için bir hata ayıklayıcı kullanıyor musunuz?