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

 
законопослушный гражданин # :

Soruyu ikinci kez gündeme getirdiğim için özür dilerim.

 // Параметры советника
input string   sParametersEA = "" ;     // Параметры советника
input double   Lot           = 0.01 ;   // Количество лотов
input int      StopLoss      = 30 ;     // Уровень убытка
input int      TakeProfit    = 30 ;     // Уровень прибыли
input int      Slippage      = 3 ;       // Проскальзование (в пунктах)
input int      Magic         = 1 ;       // Индентификатор советника
input double   K_Martin1     = 2.0 ;     // Множитель мартин 1
input double   K_Martin2     = 2.0 ;     // Множитель мартин 2
input double   K_Martin3     = 2.0 ;     // Множитель мартин 3
input int      OrdersClose   = 5 ;       // Ограничение лотности мартин1
input int      OrdersClose2  = 5 ;       // Ограничение лотности мартин2
input int      DigitsLot     = 2 ;       // Точность лотности
// Параметры индикатора
input string   sParametersMA = "" ;     // Параметры индикатора
input int      PeriodMA      = 14 ;     // Период мувинга
input int      MovingShift   = 1 ;       // Сдвиг мувинга
// Глобальные переменные
string AC;
datetime Start, newbar;
double dMA;
double MaxMartinLot;
double MaxMartinLot2;
//+-----------------------------------------------------------------------------------------------+
int OnInit ()
  {
Start          = TimeCurrent ();
MaxMartinLot   = Lot* MathPow ( 1.4 ,OrdersClose);
MaxMartinLot2  = Lot* MathPow (K_Martin2,OrdersClose2);
AC             = StringConcatenate ( " " , AccountCurrency());
return ( INIT_SUCCEEDED );
  }
//+-----------------------------------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {

  }
//+-----------------------------------------------------------------------------------------------+
void OnTick ()
  {
// Получим значение индикатора
   dMA = iMA ( Symbol (), 0 ,PeriodMA, MovingShift, MODE_SMA , PRICE_CLOSE , 0 ); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
       if (CountOrders()== 0 )
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
       if (bSignalBuy() == true )
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
       if (bSignalSell() == true )
         vOrderOpenSell();
     }
   }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
int CountOrders() 
  {
   int cnt= 0 ;
   int i= OrdersTotal ()- 1 ;
   for ( int pos=i;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol()== _Symbol )
           {
             if (OrderMagicNumber()==Magic) cnt++;
           }
        }
     }
   return (cnt);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на покупку |
//+-----------------------------------------------------------------------------------------------+
bool bSignalBuy()
  {
   if (dMA > Open[ 1 ] && dMA < Close[ 1 ])   //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.
       return ( true );

   return ( false );
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
  {
   if (dMA < Open[ 1 ] && dMA > Close[ 1 ])
       return ( true );

   return ( false );
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на покупку |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenBuy()
  {
   if (newbar!=Time[ 0 ])
     {
   // Тикет ордера
       int iOTi = 0 ;   
   
      iOTi = OrderSend ( Symbol (), OP_BUY, LOT(), Ask, Slippage, 0 , 0 , "" , Magic, 0 , clrNONE );
      
   // Проверим открылся ли ордер
       if (iOTi > 0 )
   // Есди да, то выставим уровни убытка и прибыли
         vOrderModify(iOTi);
       else
   // Если нет, то получим ошибку
         vError( GetLastError ());
      newbar=Time[ 0 ];
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на продажу |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenSell()
  {
   if (newbar!=Time[ 0 ])
     {
   // Тикет ордера  
       int iOTi = 0 ;   
   //Print(bCheckOrders());
      iOTi = OrderSend ( Symbol (), OP_SELL, LOT(), Bid, Slippage, 0 , 0 , "" , Magic, 0 , clrNONE );
   
   // Проверим открылся ли ордер
       if (iOTi > 0 )
   // Есди да, то выставим уровни убытка и прибыли
         vOrderModify(iOTi);
       else
   // Если нет, то получим ошибку
         vError( GetLastError ());
      newbar=Time[ 0 ];
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                    Функция модификации ордера |
//+-----------------------------------------------------------------------------------------------+
void vOrderModify( int iOTi)
  {
   int     iOTy = - 1 ;     // Тип ордера
   double dOOP = 0 ;     // Цена открытия ордера
   double dOSL = 0 ;     // Стоп Лосс
   int     iMag = 0 ;     // Идентификатор советника
   double dSL  = 0 ;     // Уровень убытка
   double dTP  = 0 ;     // Уровень прибыли

// Выберем по тикету открытый ордер, получим некоторые значения
   if ( OrderSelect (iOTi, SELECT_BY_TICKET, MODE_TRADES))
     {
      iOTy = OrderType();
      dOOP = OrderOpenPrice();
      dOSL = OrderStopLoss();
      iMag = OrderMagicNumber();
     }

// Если ордер открыл данный советник, то входим в условие
   if (OrderSymbol() == Symbol () && OrderMagicNumber() == iMag)
     {
// Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордер
       if (dOSL == 0 )
        {
         if (iOTy == OP_BUY)
           {
            dSL = NormalizeDouble (dOOP - StopLoss * Point , Digits );
            dTP = NormalizeDouble (dOOP + TakeProfit * Point , Digits );

             bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0 , clrNONE );
           }

         if (iOTy == OP_SELL)
           {
            dSL = NormalizeDouble (dOOP + StopLoss * Point , Digits );
            dTP = NormalizeDouble (dOOP - TakeProfit * Point , Digits );

             bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0 , clrNONE );
           }
        }
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                      Функция обработки ошибок |
//+-----------------------------------------------------------------------------------------------+
void vError( int iErr)
  {
   switch (iErr)
     {
       case 129 :   // Неправильная цена
       case 135 :   // Цена изменилась
       case 136 :   // Нет цен
       case 138 :   // Новые цены
         Sleep ( 1000 );
         RefreshRates();
         break ;

       case 137 :   // Брокер занят
       case 146 :   // Подсистема торговли занята
         Sleep ( 3000 );
         RefreshRates();
         break ;
     }
  }
//+-----------------------------------------------------------------------------------------------+
double LOT()
{
   int n= 0 ;
   int m= 0 ;
   int v= 0 ;
   double OL=Lot;
   for ( int j = OrdersHistoryTotal()- 1 ; j >= 0 ; j--)
   {
       if ( OrderSelect (j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic)
         {
             if (OrderProfit()> 0 ) 
            {

               if (n== 0 ) OL= NormalizeDouble (OrderLots()+K_Martin1,DigitsLot);
               n++;
               
               if ((OL>=MaxMartinLot)&& (m== 0 )) OL= NormalizeDouble (OrderLots()*K_Martin2,DigitsLot);
               m++;
               
               if ((OL>=MaxMartinLot2) && (v== 0 )) OL= NormalizeDouble (OrderLots()*K_Martin3,DigitsLot);
               v++;
            }
             else
            {
               if (n== 0 ) { return (Lot);}
               else { return (OL);}
            }
         }
      }
   }
   
   return (OL);
}
Michael Matkovskij :
Bu sinyali geçecek
 
MakarFX # :
Bu sinyali geçecek

Teşekkürler, her iki seçeneği de deneyeceğim

 
Lütfen bana söyle,

1. MT5'te çalıştığı gibi çoklu test: toplam süreye göre her çift sırayla veya paralel olarak (gerçek çoklu para birimi ticaretinin taklidi)

2. Strateji test cihazında MT 4'teki başka bir döviz çiftinden gelen gösterge verilerini kullanabilir miyim?
 
söyle bana, lütfen, danışmanı gerçek keneler üzerinde her test ettiğinizde (zaman periyodu ve komisyoncu aynıdır), MT5 terminali her seferinde komisyoncudan aynı verileri yükler? MT5'in bu verileri bir kez indirip bilgisayarımdan yüklemesi gerekmez mi?
 
законопослушный гражданин # :

Teşekkürler, her iki seçeneği de deneyeceğim

Lanet olsun her iki gazete de çalışıyor! hangisi daha iyi??

 
Ivan Butko çoklu para birimi ticaretinin taklidi)

2. Strateji test cihazında MT 4'teki başka bir döviz çiftinden gelen gösterge verilerini kullanabilir miyim?

2. Evet, ancak çiftin verileri önce teklif arşivine yüklenmelidir ve yalnızca yüklenen aralıktan itibaren kullanılabilir olacaktır, her TF'nin kendi tarihleri vardır. Dakikalarca, 5 genellikle artık yoktur. Sipariş verilemez, ancak çubuklardan ve buna bağlı olarak göstergelerden veriler alınabilir. Kene verisi de yok.

 
законопослушный гражданин # :

Lanet olsun her iki gazete de çalışıyor! hangisi daha iyi??

Michael'ın seçeneği, sinyali yalnızca yeni bir mumun ilk tıklamasında kontrol eder, sinyal ilk tıklamadan daha sonraysa danışman onu kaçırır.
 
MakarFX # :
Michael'ın seçeneği, sinyali yalnızca yeni bir mumun ilk tıklamasında kontrol eder, sinyal ilk tıklamadan daha sonraysa danışman onu kaçırır.

yani, testte, Mikhail'in versiyonuna göre, aynı dönem için daha az sipariş mi olmalı?

 
законопослушный гражданин # :

yani, testte, Mikhail'in versiyonuna göre, aynı dönem için daha az sipariş mi olmalı?

Belki.
 
Valeriy Yastremskiy # :

2. Evet, ancak çiftin verileri önce teklif arşivine yüklenmelidir ve yalnızca yüklenen aralıktan itibaren kullanılabilir olacaktır, her TF'nin kendi tarihleri vardır. Dakikalarca, 5 genellikle artık yoktur. Sipariş verilemez, ancak çubuklardan ve buna bağlı olarak göstergelerden veriler alınabilir. Kene verisi de yok.

teşekkürler