Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 70

 
Здравствуйте! Помогите пожалуйста с написанием функции в MT4. Мне известен баланс счета(AccountBalance), известно сколько сделок у меня откроется(например 9),известен риск (например 3% от AccountBalance), мне нужно расчитать лот первой сделки, если каждый следующий лот будет увеличиваться в два раза и все сделки будут перекрывать друг друга одна за другой.
//Функция расчета торгового лота
double GetLots()
{
 double clots = 0.0;
 double cl = NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),2); 
 double L2 = NormalizeDouble(cl * Multipler,2);
 double L3 = NormalizeDouble(L2 * Multipler,2);
 double L4 = NormalizeDouble(L3 * Multipler,2);
 double L5 = NormalizeDouble(L4 * Multipler,2);
 double L6 = NormalizeDouble(L5 * Multipler,2);
 double L7 = NormalizeDouble(L6 * Multipler,2);
 double L8 = NormalizeDouble(L7 * Multipler,2);
 double L9 = NormalizeDouble(L8 * Multipler,2);
 
 for(cl = NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),2);AccountFreeMarginCheck(Symbol(),OP_BUY,L9) <= (AccountBalance()/100)*Risk;cl--)
 {
  if(!IsStopped()) 
  {
   clots = NormalizeDouble(cl,2);
  }
 } 
 return(clots);
}

Вот что получилось. Подскажите пожалуйста в чем ошибка. Заранее спасибо!

 

Здравствуйте!

Пишу сюда, т.к. на mq4 никого вроде как нет.

Подскажите пожалуйста, что я не правильно делаю? Вариант 2 не работает.

double A[][10];
int renge_A_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_A_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)

double B[][10];
int renge_B_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_B_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)
int count_B=0;

//+------------------------------------------------------------------+
//| Вариант 1. Копируем строки "А" в "В" без изменений               |
//+------------------------------------------------------------------+
void Fun_1()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         count_B++;
         ArrayResize(B, count_B);
         for(int j=0; j<renge_A_two; j++)                             // Перебираем массив A[][10] по ВТОРОМУ измерению.
              B[i][j]=A[i][j];
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: "А" скопирован в "В" без изменений 
//            renge_A_one = renge_В_one
//            renge_A_two = renge_В_two

//+------------------------------------------------------------------+
//| Вариант 2. Копируем строки "А" в "В" при условии                 |
//+------------------------------------------------------------------+
void Fun_2()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         if(A[i][3]>0)
             {
              count_B++;
              ArrayResize(B, count_B);
              for(int j=0; j<renge_A_two; j++)                        // Перебираем массив A[][10] по ВТОРОМУ измерению.
                   B[i][j]=A[i][j];
             }
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: часть строк "В" с соответствующими значениями
//            часть строк "В" заполнена "0" полностью, при том, что в "А" заполнены ЗНАЧЕНИЯМИ
//            renge_A_one > renge_В_one
//            renge_A_two = renge_В_two
 
Arseniy Barudkin:
Здравствуйте! Помогите пожалуйста с написанием функции в MT4. Мне известен баланс счета(AccountBalance), известно сколько сделок у меня откроется(например 9),известен риск (например 3% от AccountBalance), мне нужно расчитать лот первой сделки, если каждый следующий лот будет увеличиваться в два раза и все сделки будут перекрывать друг друга одна за другой.

Вот что получилось. Подскажите пожалуйста в чем ошибка. Заранее спасибо!

Элементарно. Ошибка - функция  GetLots(). Вся функция.
 
Leo59:

Здравствуйте!

Пишу сюда, т.к. на mq4 никого вроде как нет.

Подскажите пожалуйста, что я не правильно делаю? Вариант 2 не работает.

double A[][10];
int renge_A_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_A_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)

double B[][10];
int renge_B_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_B_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)
int count_B=0;

//+------------------------------------------------------------------+
//| Вариант 1. Копируем строки "А" в "В" без изменений               |
//+------------------------------------------------------------------+
void Fun_1()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         count_B++;
         ArrayResize(B, count_B);
         for(int j=0; j<renge_A_two; j++)                             // Перебираем массив A[][10] по ВТОРОМУ измерению.
              B[i][j]=A[i][j];
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: "А" скопирован в "В" без изменений 
//            renge_A_one = renge_В_one
//            renge_A_two = renge_В_two

//+------------------------------------------------------------------+
//| Вариант 2. Копируем строки "А" в "В" при условии                 |
//+------------------------------------------------------------------+
void Fun_2()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         if(A[i][3]>0)
             {
              count_B++;
              ArrayResize(B, count_B);
              for(int j=0; j<renge_A_two; j++)                        // Перебираем массив A[][10] по ВТОРОМУ измерению.
                   B[i][j]=A[i][j];
             }
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: часть строк "В" с соответствующими значениями
//            часть строк "В" заполнена "0" полностью, при том, что в "А" заполнены ЗНАЧЕНИЯМИ
//            renge_A_one > renge_В_one
//            renge_A_two = renge_В_two

Выделил: должно быть присвоение - "=", а у Вас сравнение - "==". 

 

Всем привет !
Учусь писать роботов в mt4, решил начать с бинарных опционов . Пишу самого простого советника и компилятор выдает кучу предупреждений с которыми я разобраться не как не могу (
Помогите : " О гуру MQL4" =))))))
Заранее спасибо!)

Вот код советника.

//+------------------------------------------------------------------+
//|                                       Bolinger_Bands_traider.mq4 |
//|                                   Copyright 2017, Penrov Nikolay |
//|                                               vk.com/buzamonolit |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Petrov Nikolay"
#property link      "vk.com/buzamonolit"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
extern int     Bolinger_Bands = 20;      // Период Полос Боллинджера
extern double    Delta = 0.0003;       // На каком расстоянии открывать ордер
 
string Symb;                        // Название финанс. инструмента
int Total;                          // Количество ордеров

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   Initialize_Objects(0);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
double price = Bid;
double CurrBol_High = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_UPPER, 0);
double CurrBol_Low = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_LOWER, 0);
double PriceBol_High = price - CurrBol_High;
double PriceBol_Low = price - CurrBol_Low;
datetime NextClose = Time[0] + Period()*60*2;
int MinutesToNextClose = (NextClose - TimeCurrent())/60 + 1;
int err;

   // Учёт ордеров
   Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return(0);                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total>1)                           // Не более одного орд
           {
            Alert("Несколько рыночных ордеров. Эксперт не работает.");
            return(0);                             // Выход из start()
           }
        }
     }

ObjectSetText("Obj_Label", "ТФ" + Period() + ", " + DoubleToStr(price, 5) + ", тик " + TimeToStr(TimeCurrent(), TIME_SECONDS) + ", O@" + TimeToStr(Time[0], TIME_MINUTES) + ", NC@" + TimeToStr(NextClose, TIME_MINUTES) + " (" + MinutesToNextClose + " min)", 10, "Arial", DarkGreen );
ObjectSetText("Obj_Label2", "Ордеров: " + Total +  ", дельта " + DoubleToStr(Delta,5) + ", расст до MA:" + DoubleToStr(PriceBol_High, 5), 10, "Arial", DarkGreen );
ObjectSetText("Obj_Label3", "Ордеров: " + Total +  ", дельта " + DoubleToStr(Delta,5) + ", расст до MA:" + DoubleToStr(PriceBol_Low, 5), 10, "Arial", DarkGreen );


//  анализ цены и открытие ордеров

if ((MathAbs(PriceBol_Low) < Delta) && (price > CurrBol_Low) && (Open[0] > CurrBol_Low+Delta) && (Total<1))
{
   if (OrderSend(Symbol(), OP_BUY, 1.00,Bid , 3, 0, 0,"BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Green) >0) Print ("Opened OK");
   else
   {
     err=GetLastError();
     Print("error(",err,")");
     return(0);

   }
   Print ("CALL @ " + price + " " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp in " + MinutesToNextClose);
  
}

if ((MathAbs(PriceBol_High) < Delta) && (price < CurrBol_High) && (Open[0] < CurrBol_High-Delta) && (Total<1))
{
   if (OrderSend(Symbol(), OP_SELL, 1.00,Bid , 3, 0, 0,"BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Red) > 0) Print ("Opened OK");
   else
   {
     err=GetLastError();
     Print("error(",err,")");
     return(0);

   }  
   Print  ("PUT @ " + price + " " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp in " + MinutesToNextClose);
  
}

//----
   return(0);
  }
//+------------------------------------------------------------------+

int Initialize_Objects(int Win)                         // Пользовательс ф-ия
  {                                             // ..создания объекта
   ObjectCreate("Obj_Label",OBJ_LABEL, Win, 0,0); // Создание объекта
   ObjectSet("Obj_Label", OBJPROP_CORNER, 0);     // Привязка к углу
   ObjectSet("Obj_Label", OBJPROP_XDISTANCE, 13);  // Координата Х
   if (Win==0)
      ObjectSet("Obj_Label",OBJPROP_YDISTANCE, 15);// Координата Y
   else
      ObjectSet("Obj_Label",OBJPROP_YDISTANCE,15);// Координата Y
     
   ObjectCreate("Obj_Label2",OBJ_LABEL, Win, 0,0); // Создание объекта
   ObjectSet("Obj_Label2", OBJPROP_CORNER, 0);     // Привязка к углу
   ObjectSet("Obj_Label2", OBJPROP_XDISTANCE, 13);  // Координата Х
   if (Win==0)
      ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);// Координата Y
   else
      ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);// Координата Y
     
   ObjectCreate("Obj_Label3",OBJ_LABEL, Win, 0,0); // Создание объекта
   ObjectSet("Obj_Label3", OBJPROP_CORNER, 0);     // Привязка к углу
   ObjectSet("Obj_Label3", OBJPROP_XDISTANCE, 13);  // Координата Х
   if (Win==0)
      ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);// Координата Y
   else
      ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);// Координата Y
       
   return(0);                                      // Выход из польз.ф-ии
  }

 

А вот предупреждения. Не могу понять , что ему не нравится(

 
possible loss of data due to type conversion    Bolinger_Bands_traider.mq4    51    24
implicit conversion from 'number' to 'string'    Bolinger_Bands_traider.mq4    76    35
implicit conversion from 'number' to 'string'    Bolinger_Bands_traider.mq4    76    227
implicit conversion from 'number' to 'string'    Bolinger_Bands_traider.mq4    77    43
implicit conversion from 'number' to 'string'    Bolinger_Bands_traider.mq4    78    43
implicit conversion from 'string' to 'number'    Bolinger_Bands_traider.mq4    85    71
implicit conversion from 'number' to 'string'    Bolinger_Bands_traider.mq4    93    23
implicit conversion from 'number' to 'string'    Bolinger_Bands_traider.mq4    93    91
implicit conversion from 'string' to 'number'    Bolinger_Bands_traider.mq4    99    72
implicit conversion from 'number' to 'string'    Bolinger_Bands_traider.mq4    107    23
implicit conversion from 'number' to 'string'    Bolinger_Bands_traider.mq4    107    91
0 error(s), 11 warning(s), compile time: 204 msec        1    12

 
Vitalie Postolache:
Элементарно. Ошибка - функция  GetLots(). Вся функция.

Может подскажете как правильно написать. Я хотел вычислить с помощью цикла путем перебора от максимального лота.
 
Arseniy Barudkin:

Может подскажете как правильно написать. Я хотел вычислить с помощью цикла путем перебора от максимального лота.


А где логика? Вы ставите на  первый ордер максимальный разрешенный лот, а потом увеличиваете его для каждого следующего ордера. Вам это не кажется, мягко говоря, не очень разумным?

Далее, вы уменьшаете в цикле лот первого ордера каким-то совсем уже не поддающимся логике методом, а лоты остальных ордеров, которые были "вычислены" до этого, так и остаются, без изменений, притом, за пределы этой фукции эти значения не выходят никак. Зачем тогда они?

Не говоря уж о том, что инкремент цикла не может быть вещественным числом, это счётчик, целое число должно быть. А вы ставите в качестве счётчика значение лота и вычитаете из него каждую итерацию по единичке. Это крупная ошибка, очень серьёзная.

Доработайте логику сначала в голове, а потом уже пытайтесь воплотить её в код.

 
bog_v_nas:

А вот предупреждения. Не могу понять , что ему не нравится(

 
possible loss of data due to type conversion    Bolinger_Bands_traider.mq4    51    24
implicit conversion from 'number' to 'string'    Bolinger_Bands_traider.mq4    76    35
implicit conversion from 'number' to 'string'    Bolinger_Bands_traider.mq4    76    227
implicit conversion from 'number' to 'string'    Bolinger_Bands_traider.mq4    77    43
implicit conversion from 'number' to 'string'    Bolinger_Bands_traider.mq4    78    43
implicit conversion from 'string' to 'number'    Bolinger_Bands_traider.mq4    85    71
implicit conversion from 'number' to 'string'    Bolinger_Bands_traider.mq4    93    23
implicit conversion from 'number' to 'string'    Bolinger_Bands_traider.mq4    93    91
implicit conversion from 'string' to 'number'    Bolinger_Bands_traider.mq4    99    72
implicit conversion from 'number' to 'string'    Bolinger_Bands_traider.mq4    107    23
implicit conversion from 'number' to 'string'    Bolinger_Bands_traider.mq4    107    91
0 error(s), 11 warning(s), compile time: 204 msec        1    12

Выведите одну строку с номером 51, т.к. здесь не посчитать, чтобы понять ошибку "possible loss of data due to type conversion    Bolinger_Bands_traider.mq4    51    24"

Остальное: "implicit conversion from 'number' to 'string'    Bolinger_Bands_traider.mq4    107    91" говорит о том что надо:

переведите числовые значения в текстовую строку там где создаем объект - текстовую строку, например

Period()

должно быть

DoubleToString(Period(),0)

 
Renat Akhtyamov:

переведите числовые значения в текстовую строку там где создаем объект - текстовую строку, например

Period()

должно быть

DoubleToString(Period(),0)


А с каких это пор период - типа Double?