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

 

올바르게 쓰는 방법?

"a" * "b" "x" 번, 즉

"x=3"인 경우

그런 다음 "a*b*b*b"

 
a*MathPow(b,x)
 
Aleksei Stepanenko :
좋아요. 감사합니다.
 
MakarFX :

감사합니다, 하지만 이것은 어떤 식으로든 내 코드를 단순화하지 않습니다)

따라서 2가지 조건, 즉 모듈, 차이 및 1가지 조건 대신 범위의 중간을 계산하려고 합니다.

 
MakarFX :

정말 감사합니다!

연결된 것처럼 더 이상 오류는 없지만 여전히 작동하지 않습니다. 거래를 열지 않습니다. 코드 부분 사이에 연결이 없는 부분이 이해되지 않습니다.

무엇을 잘못했는지 봐주세요.

 //+-----------------------------------------------------------------------------------------------+
//|                                                                     Simple Moving Average.mq4 |
//|                                                                 Copyright 2016, Andrey Minaev |
//|                                                     https://www.mql5.com/ru/users/id.scorpion |
//+-----------------------------------------------------------------------------------------------+
#property copyright "Copyright 2016, Andrey Minaev"
#property link        " https://www.mql5.com/ru/users/id.scorpion "
#property version    "1.00"
#property strict

// Параметры советника
extern string sParametersEA = "" ;     // Параметры советника
extern double dLots         = 0.01 ;   // Количество лотов
extern int     iStopLoss     = 30 ;     // Уровень убытка (в пунктах)
extern int     iTakeProfit   = 30 ;     // Уровень прибыли (в пунктах)
extern int     iSlippage     = 3 ;       // Проскальзование (в пунктах)
extern int     iMagic        = 1 ;       // Индентификатор советника
extern double K_Martin      = 2.0 ;     // Умножает лот после SL. пока не получим TP
extern int     OrdersClose  = 5 ;
extern int     DigitsLot    = 2 ;
// Параметры индикатора
extern string sParametersMA = "" ;     // Параметры индикатора
extern int     iPeriodMA     = 14 ;     // Период усреднения
// Глобальные переменные
double dMA;
double MINLOT,MAXLOT,MaxMartinLot;
//+-----------------------------------------------------------------------------------------------+
int OnInit ()
  {
// Если брокер использует 3 или 5 знаков после запятой, то умножаем на 10
   if ( Digits == 3 || Digits == 5 )
     {
      iStopLoss   *= 10 ;
      iTakeProfit *= 10 ;
      iSlippage   *= 10 ;
     }

   return ( INIT_SUCCEEDED );
  }
//+-----------------------------------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {

  }
//+-----------------------------------------------------------------------------------------------+
void OnTick ()
  {
// Получим значение индикатора
   dMA = iMA ( Symbol (), 0 , iPeriodMA, 0 , MODE_SMA , PRICE_CLOSE , 0 );

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

       // Если появился сигнал на продажу, то откроем ордер на продажу
       if (bSignalSell() == true )
         vOrderOpenSell();
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
bool bCheckOrders()
  {
// Переберем в цикле ордера, для проверки открытых ордеров данным советником
   for ( int i = 0 ; i <= OrdersTotal (); i++)
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == iMagic)
             return ( false );

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

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

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

   iOTi = OrderSend ( Symbol (), OP_BUY, Lots(), Ask, iSlippage, 0 , 0 , "" , iMagic, 0 , clrNONE );

// Проверим открылся ли ордер
   if (iOTi > 0 )
       // Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
       // Если нет, то получим ошибку
      vError( GetLastError ());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на продажу |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenSell()
  {
   int iOTi = 0 ;   // Тикет ордера

   iOTi = OrderSend ( Symbol (), OP_SELL, Lots(), Bid, iSlippage, 0 , 0 , "" , iMagic, 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 - iStopLoss * Point , Digits );
            dTP = NormalizeDouble (dOOP + iTakeProfit * Point , Digits );

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

         if (iOTy == OP_SELL)
           {
            dSL = NormalizeDouble (dOOP + iStopLoss * Point , Digits );
            dTP = NormalizeDouble (dOOP - iTakeProfit * 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 Lots()
  {
   double L= 0 ;
   // если последняя закрытая сделка убыточная и лот равен стартовому
   // включаем Мартин
   if (GetInfoLastPos( 2 )< 0 &&GetInfoLastPos( 1 )==dLots) 
     {
      K_Martin= true ;
     }
   // если последняя закрытая сделка убыточная и лот больше или равен максимальному
   // выключаем Мартин
   if (GetInfoLastPos( 2 )< 0 &&GetInfoLastPos( 1 )>=MaxMartinLot)
     {
      K_Martin= false ;
     }
   // если последняя закрытая сделка убыточная и Мартин включен, умножаем лот
   if (K_Martin== true )
     {
      L= NormalizeDouble (GetInfoLastPos( 1 )*K_Martin,DigitsLot);
     }
   // если последняя закрытая сделка убыточная и Мартин выключен, делим лот
   if (K_Martin== false )
     {
      L= NormalizeDouble (GetInfoLastPos( 1 )/K_Martin,DigitsLot);
     }

   if (L>MAXLOT) L = MAXLOT;
   if (L<MINLOT) L = MINLOT;
   return (L);
  }
//+----------------------------------------------------------------------------+
//|  Функция возвращает по символу и магику                                    |
//|  1 - размер лота последней закрытой позиции                                |
//|  2 - размер профита с учетом комиссии и свопа последней закрытой позиции   |
//|  3 - время последней закрытой позиции                                      |
//+----------------------------------------------------------------------------+
double GetInfoLastPos( int a= 1 )
  {
   datetime t= 0 ;
   double result= 0 ,l= 0 ,p= 0 ,f= 0 ;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==iMagic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime()) {t=OrderCloseTime(); l=OrderLots(); p=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   if (a== 1 ) {result=l;} else
   if (a== 2 ) {result=p;} else
   if (a== 3 ) {result=( double )t;}
   else      {result= 0 ;}
   return (result);
  }
//+------------------------------------------------------------------+

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

정말 감사합니다!

연결된 것처럼 더 이상 오류는 없지만 여전히 작동하지 않습니다. 거래를 열지 않습니다. 코드 부분 사이에 연결이 없는 부분이 이해되지 않습니다.

봐주세요, 뭘 잘못했어요?

잘못된

 //+------------------------------------------------------------------+
//| Расчет лота                                                      |
//+------------------------------------------------------------------+
double Lots()
  {
   double L= 0 ;
   // если последняя закрытая сделка убыточная и лот равен стартовому
   // включаем Мартин
   if (GetInfoLastPos( 2 )< 0 &&GetInfoLastPos( 1 )==dLots) 
     {
       K_Martin = true ;
     }
   // если последняя закрытая сделка убыточная и лот больше или равен максимальному
   // выключаем Мартин
   if (GetInfoLastPos( 2 )< 0 &&GetInfoLastPos( 1 )>= MaxMartinLot )
     {
       K_Martin = false ;
     }
   // если последняя закрытая сделка убыточная и Мартин включен, умножаем лот
   if ( K_Martin == true )
     {
      L= NormalizeDouble (GetInfoLastPos( 1 )*K_Martin,DigitsLot);
     }
   // если последняя закрытая сделка убыточная и Мартин выключен, делим лот
   if ( K_Martin == false )
     {
      L= NormalizeDouble (GetInfoLastPos( 1 )/K_Martin,DigitsLot);
     }

   if (L>MAXLOT) L = MAXLOT;
   if (L<MINLOT) L = MINLOT;
   return (L);
  }
 
законопослушный гражданин :

정말 감사합니다!

연결된 것처럼 더 이상 오류는 없지만 여전히 작동하지 않습니다. 거래를 열지 않습니다. 코드 부분 사이에 연결이 없는 부분이 이해되지 않습니다.

무엇을 잘못했는지 봐주세요.

내가 준 "Lot Calculation"기능을 설정하십시오 (변경 없음)

강조 표시 추가

 // Глобальные переменные
double dMA;
double MINLOT,MAXLOT;
double MaxMartinLot;
bool    Martin= false ;
//+-----------------------------------------------------------------------------------------------+
int OnInit ()
  {
   MaxMartinLot=Lot* MathPow (K_Martin, 3 );
// Если брокер использует 3 или 5 знаков после запятой, то умножаем на 10
   if ( Digits == 3 || Digits == 5 )
     {
      iStopLoss   *= 10 ;
      iTakeProfit *= 10 ;
      iSlippage   *= 10 ;
     }

   return ( INIT_SUCCEEDED );
  }

 
MakarFX :

잘못된

감사하다.

그대로 돌아왔습니다. 세 가지 오류가 발생합니다. 'Martin' - 선언되지 않은 식별자

다른 전역 변수 를 설정해야 합니까?

 double Lots()
  {
   double L= 0 ;
   // если последняя закрытая сделка убыточная и лот равен стартовому
   // включаем Мартин
   if (GetInfoLastPos( 2 )< 0 &&GetInfoLastPos( 1 )==dLots) 
     {
      Martin= true ;
     }
   // если последняя закрытая сделка убыточная и лот больше или равен максимальному
   // выключаем Мартин
   if (GetInfoLastPos( 2 )< 0 &&GetInfoLastPos( 1 )>=MaxMartinLot)
     {
      Martin= false ;
     }
   // если последняя закрытая сделка убыточная и Мартин включен, умножаем лот
   if (Martin== true )
     {
      L= NormalizeDouble (GetInfoLastPos( 1 )*K_Martin,DigitsLot);
     }
   // если последняя закрытая сделка убыточная и Мартин выключен, делим лот
   if (Martin== false )
     {
      L= NormalizeDouble (GetInfoLastPos( 1 )/K_Martin,DigitsLot);
     }

   if (L>MAXLOT) L = MAXLOT;
   if (L<MINLOT) L = MINLOT;
   return (L);
  }

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

감사하다.

그대로 돌아왔습니다. 세 가지 오류가 발생합니다. 'Martin' - 선언되지 않은 식별자

다른 전역 변수 를 설정해야 합니까?


여기

 
MakarFX :

내가 준 "Lot Calculation"기능을 설정하십시오 (변경 없음)

강조 표시 추가

만들어진.

이제 'Lot'는 선언되지 않은 식별자입니다.

나는 필요합니다: extern double dLots = 0.01; 다음으로 대체: extern double Lot = 0.01; ?

오 아니 ... 그것도 작동하지 않는 것 같습니다.