MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1801

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

두 번째 질문을 드려 죄송합니다.

 // Параметры советника
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);
}
마이클 마트코프스키 :
이것은 신호를 전달할 것입니다
 
MakarFX # :
이것은 신호를 전달할 것입니다

감사합니다. 두 가지 옵션을 모두 시도해 보겠습니다.

 
말해주세요,

1. 작동하는 MT5의 다중 테스트: 총 시간에 따라 각 쌍을 차례로 또는 병렬로(실제 다중 통화 거래 모방)

2. 전략 테스터에서 MT 4의 다른 통화 쌍의 지표 데이터를 사용할 수 있습니까?
 
제발, 왜 실제 틱에 대한 어드바이저를 테스트할 때마다(기간 및 브로커가 동일함) MT5 터미널이 브로커에서 매번 동일한 데이터를 로드합니까? MT5가 이 데이터를 한 번 다운로드한 다음 내 컴퓨터에서 업로드하면 안 됩니까?
 
законопослушный гражданин # :

감사합니다. 두 가지 옵션을 모두 시도해 보겠습니다.

젠장, 두 스위치 모두 작동합니다! 어느게 더 나은가요??

 
Ivan Butko 다중 통화 거래 모방)

2. 전략 테스터에서 MT 4의 다른 통화 쌍의 지표 데이터를 사용할 수 있습니까?

2. 예, 하지만 쌍의 데이터는 먼저 시세 아카이브에 업로드해야 하며 업로드된 간격에서만 사용할 수 있습니다. 각 TF에는 고유한 날짜가 있습니다. 몇 개월 동안 5는 일반적으로 더 이상 없습니다. 주문은 할 수 없지만 막대에서 데이터를 수신할 수 있으며 따라서 표시기에서 데이터를 수신할 수 있습니다. 틱 데이터도 없습니다.

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

젠장, 두 스위치 모두 작동합니다! 어느게 더 나은가요??

Michael의 옵션은 새 양초의 첫 번째 틱에서만 신호를 확인합니다. 신호가 첫 번째 틱보다 늦으면 어드바이저가 놓칩니다.
 
MakarFX # :
Michael의 옵션은 새 양초의 첫 번째 틱에서만 신호를 확인합니다. 신호가 첫 번째 틱보다 늦으면 어드바이저가 놓칩니다.

즉, 테스트에서 Mikhail의 버전에 따르면 같은 기간 동안 더 적은 주문이 있어야 합니까?

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

즉, 테스트에서 Mikhail의 버전에 따르면 같은 기간 동안 더 적은 주문이 있어야 합니까?

아마도.
 
Valeriy Yastremskiy # :

2. 예, 하지만 쌍의 데이터는 먼저 시세 아카이브에 업로드해야 하며 업로드된 간격에서만 사용할 수 있습니다. 각 TF에는 고유한 날짜가 있습니다. 몇 개월 동안 5는 일반적으로 더 이상 없습니다. 주문은 할 수 없지만 막대에서 데이터를 수신할 수 있으며 따라서 표시기에서 데이터를 수신할 수 있습니다. 틱 데이터도 없습니다.

감사해요