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

 
MakarFX # :

Farkı bir kez daha vurguluyorum

1 seçenek

seçenek 2

Evet. teşekkür etmek. Anladım.

 
Mihail Matkovskij # :

OrdersTotal , OrdersHistoryTotal 'u körü körüne kopyalamak yerine ne kodladığınızı anlamaya çalışın.

SiparişSeç

teşekkürler.

 
//+-----------------------------------------------------------------------------------------------+
//|                                                                     Simple Moving Average.mq4 |
//|                                                                                               |
//+-----------------------------------------------------------------------------------------------+
#property copyright "Copyright 2021"
#property link        " https://www.mql5.com/ru/users/ "
#property version    "1.00"
#property strict

// Параметры советника
input string   sParametersEA = "" ;     // Параметры советника
input double   Lot           = 0.01 ;   // Количество лотов
input double   LotControl    = 0.01 ;   // Контрольная лотность
input int      StopLoss      = 30 ;     // Уровень убытка
input int      TakeProfit    = 30 ;     // Уровень прибыли
input int      Deviation     = 20 ;     // Отступ цены входа
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   ParametersMA  = "" ;     // Параметры индикатора
input int      PeriodMA      = 14 ;     // Период мувинга
input int      MovingShift   = 1 ;       // Сдвиг мувинга
// Глобальные переменные
string AC;
datetime Start;
double dMA;
double MaxMartinLot;
double MaxMartinLot2;
double openPrice;   // цена открытия позиции
//+-----------------------------------------------------------------------------------------------+
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 (GetLotSize()<LotControl)  openPrice = dMA;
   
     else 
    openPrice = dMA + Deviation * _Point ;
// Если нет открытых ордеров, то входим в условие
   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 (openPrice > Open[ 1 ] && openPrice < Close[ 1 ]) //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.
   
   return ( true );
   
   return ( false );
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
   
  {
   if (openPrice< Open[ 1 ] && openPrice > Close[ 1 ])

   return ( true );

   return ( false );
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на покупку |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenBuy()
  {
// Тикет ордера
   int iOTi = 0 ;   

   iOTi = OrderSend ( Symbol (), OP_BUY, LOT(), Ask, Slippage, 0 , 0 , "" , Magic, 0 , clrNONE );
   
// Проверим открылся ли ордер
   if (iOTi > 0 )
// Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
// Если нет, то получим ошибку
      vError( GetLastError ());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на продажу |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenSell()
  {
// Тикет ордера  
   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 ());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                    Функция модификации ордера |
//+-----------------------------------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
//|  Функция считает по символу и магику                             |
//|  размер лота с начала цикла                                      |
//+------------------------------------------------------------------+
double GetLotSize()
  {
   double Ls= 0 ;
   datetime t= 0 ;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }

geçersiz OnTick() bölümünü yeniden düzenledi

böylece belirli bir parti büyüklüğüne (LotControl) ulaşıldığında, sinyale belirli sayıda nokta eklenecektir (Sapma parametresi)

sonunda problemlerle çalışır:

İlk olarak, geriye dönük test, 500 işlemden sonra (dakikada 1-2 işlem) neredeyse durdu.

(normal hızda başlar, sonra giderek daha yavaş gider)

ikinci olarak, Sapma (LotControl) sonrasında değil, belirtilen lot büyüklüğünden bir veya iki adım sonra bağlanır.

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

geçersiz OnTick() bölümünü yeniden düzenledi

böylece belirli bir parti büyüklüğüne (LotControl) ulaşıldığında, sinyale belirli sayıda nokta eklenecektir (Sapma parametresi)

sonunda problemlerle çalışır:

ilk olarak, geriye dönük test, 500 işlemden sonra (dakikada 1-2 işlem) neredeyse durdu.

(normal hızda başlar, sonra giderek daha yavaş gider)

ikinci olarak, Sapma (LotControl) sonrasında değil, belirtilen lot büyüklüğünden bir veya iki adım sonra bağlanır.

Şu şekilde deneyin:

boşluktan kaldır OnTick()

 // Получим значение индикатора
   dMA = iMA ( Symbol (), 0 ,PeriodMA, MovingShift, MODE_SMA , PRICE_CLOSE , 0 ); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.
   
   if (GetLotSize()<LotControl)  openPrice = dMA;
   
     else 
    openPrice = dMA + Deviation * _Point ;

ve buraya koy

 //+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на покупку |
//+-----------------------------------------------------------------------------------------------+
bool bSignalBuy()
  {
   dMA = iMA ( Symbol (), 0 ,PeriodMA, MovingShift, MODE_SMA , PRICE_CLOSE , 0 );
   openPrice = dMA + Deviation * _Point ;
   if (GetLotSize()<LotControl) openPrice = dMA;
   if (openPrice > Open[ 1 ] && openPrice < Close[ 1 ]) //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.
   
   return ( true );
   
   return ( false );
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
  {
   dMA = iMA ( Symbol (), 0 ,PeriodMA, MovingShift, MODE_SMA , PRICE_CLOSE , 0 );
   openPrice = dMA + Deviation * _Point ;
   if (GetLotSize()<LotControl) openPrice = dMA;
   if (openPrice< Open[ 1 ] && openPrice > Close[ 1 ])

   return ( true );

   return ( false );
  }
 
MakarFX # :

Şu şekilde deneyin:

boşluktan kaldır OnTick()

ve buraya koy

benzer sonuç.

bu sinyalle ilgili değil. Benzer iki danışmanım daha var ve fren yok

 
MakarFX # :

Şu şekilde deneyin:

boşluktan kaldır OnTick()

ve buraya koy

önce bu şeyde günah işledi:

 double GetLotSize()
  {
   double Ls= 0 ;
   datetime t= 0 ;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }

ama diğer iki baykuş test cihazında onunla iyi çalışıyor

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

önce bu şeyde günah işledi:

Bu şeyle her şey yolunda.

Kodunuza daha sonra bakacağım, test cihazında hangi zaman dilimini kullandığınızı ve hangi çifti yazacağım. Fren olup olmadığını kontrol edeceğim.

 
MakarFX # :

Bu şeyle her şey yolunda.

Kodunuza daha sonra bakacağım, test cihazında hangi zaman dilimini kullandığınızı ve hangi çifti yazacağım. Fren olup olmadığını kontrol edeceğim.

evet herhangi bir çift

AUD/USD M15 kullanıyorum.

Göstergenizle aynı sorunları yaşadım (ekli)

orada, eleme yöntemiyle bu şeyin süreci yavaşlattığını öğrendim:

 double GetProfitFromStart()
  {
   double lp= 0 ,cp= 0 ;
    for ( int i= 0 ; i<OrdersHistoryTotal(); i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (Start<OrderCloseTime()) {lp+=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL) {cp=OrderProfit()+OrderCommission()+OrderSwap();}
           }
        }
     }
   return (lp+cp);
  }
Dosyalar:
 
законопослушный гражданин # :

evet herhangi bir çift

AUD/USD M15 kullanıyorum.

Göstergenizle aynı sorunları yaşadım (ekli)

orada, eleme yöntemiyle bu şeyin süreci yavaşlattığını öğrendim:

sipariş toplamayı değiştir

 for ( int i= OrdersHistoryTotal()- 1 ; i>= 0 ; i--)
 
MakarFX # :

sipariş toplamayı değiştir

Beyler, kim ne derse desin, ancak son kontrolde döngü indeksinin değerini hatırlamıyorsanız, o zaman döngünüz tüm geçmiş boyunca çalışır. Ve ne kadar fazla olursa, döngü o kadar uzun olur.