新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1585

 

如何正确拼写它?

"a "*"c""x "次,即

如果 "x=3"

那么 "a*v*v*v"

 
a*MathPow(b,x)
 
Aleksei Stepanenko:
很好,谢谢你。
 
MakarFX:

谢谢,但它丝毫没有简化我的代码)

这就是为什么我试图计算范围的中间值,而不是2个条件模块,差值和一个条件。

 
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);
  }
 
законопослушный гражданин:

非常感谢您!

似乎已经连接上了,没有更多的错误,但仍然无法工作。不能打开任何交易。不明白代码的各部分之间哪里没有联系。

请看我做错了什么?

函数"手数计算",按我给出的方法放置(没有变化)

并添加突出显示的

// Глобальные переменные
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:

错了。

谢谢你。

我把它放回原来的样子。它给出了三个错误:'马丁'--未声明的标识符

我需要设置另一个全局变量 吗?

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);
  }

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

谢谢你。

我把它放回原来的样子。三个错误:'马丁'--未声明的标识符

我需要设置另一个全局变量 吗?


这里

 
MakarFX:

批量计算 " 功能,按我给出的方法设置(没有改动)。

并添加突出显示的

完成了。

现在'Lot'是一个未声明的标识符。

我需要:extern doubledLots= 0.01; 替换为:extern doubleLot= 0.01; ?

哦,不...这也行不通。

原因: