Ваши вопросы по языку MQL4

star603

Новичок форума
Просто не понятно. Я понимаю что принт не должен выводиться, но выводиться. У этого кода есть еше особеность на других таймфреймах подсчет идет через 1. То есть А =1 А = 3 и т д Это основные проблемы. Я нашел индикаторы где работает как надо. Спасибо за помощь.
 

star603

Новичок форума
Скажите пожалуйста будет работать советник если внем прописаны другие периоды в отличии от текущего скажем Н1?
 

star603

Новичок форума
Код:
double LOTR()
{
 /* Изменение лота если прошлый ордер в истории прибольный или убыточный*/
     for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS) && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         double R = OrderProfit();//Приболь выбанного ордера из истории
         double T = OrderTicket();//Тикет с приболью(может и отрицательной) выбранного ордера из истории
         if(R>0.0)//Если больше 0,0
           Print("Тикет ордера =",T,"Приболь ордера =",R,"Лот следующего ордера=",_Lot1=_Lot1*2);
         else if(R<0.0)//Если меньше 0,0
           Print("Тикет ордера =",T,"Приболь ордера =",R,"Лот следующего ордера=",_Lot1=_Lot1);
        }
     }
   return(_Lot1);//Возваращаем полученный лот
}
 

Ugar

Гуру форума
Код:
double LOTR()
{
 /* Изменение лота если прошлый ордер в истории прибольный или убыточный*/
     for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS) && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         double R = OrderProfit();//Приболь выбанного ордера из истории
         double T = OrderTicket();//Тикет с приболью(может и отрицательной) выбранного ордера из истории
         if(R>0.0)//Если больше 0,0
           Print("Тикет ордера =",T,"Приболь ордера =",R,"Лот следующего ордера=",_Lot1=_Lot1*2);
         else if(R<0.0)//Если меньше 0,0
           Print("Тикет ордера =",T,"Приболь ордера =",R,"Лот следующего ордера=",_Lot1=_Lot1);
        }
     }
   return(_Lot1);//Возваращаем полученный лот
}
1. На кой ... вычисления лота выполнять внутри принта? Может не в курсе, но принты при оптимизации не выполняются.
2. А кто сказал что последний ордер в списке является последним закрытым? Порядок в списке может меняться даже при перезапуске терминала. Если надо действительно последний закрытый, надо его и искать по времени закрытия.
 

Абдулхаким

Почетный гражданин
Код:
double LOTR()
{
 /* Изменение лота если прошлый ордер в истории прибольный или убыточный*/
     for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS) && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         double R = OrderProfit();//Приболь выбанного ордера из истории
         double T = OrderTicket();//Тикет с приболью(может и отрицательной) выбранного ордера из истории
         if(R>0.0)//Если больше 0,0
           Print("Тикет ордера =",T,"Приболь ордера =",R,"Лот следующего ордера=",_Lot1=_Lot1*2);
         else if(R<0.0)//Если меньше 0,0
           Print("Тикет ордера =",T,"Приболь ордера =",R,"Лот следующего ордера=",_Lot1=_Lot1);
        }
     }
   return(_Lot1);//Возваращаем полученный лот
}
а в чём вопрос ?
на первый взгляд, в OrderSelect() не хватает параметра MODE_HISTORY
и действительно, прибыль в некоторых случаях приходит через боль :)
 
  • Like
Реакции: Ugar

star603

Новичок форума
Код:
double LOTR1()
  {
   /* Изменение лота если прошлый ордер в истории прибольный или убыточный*/
   for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         double R = OrderProfit();//Приболь выбанного ордера из истории
         double T = OrderTicket();//Тикет с приболью(может и отрицательной) выбанного ордера из истории
         datetime OP = OrderCloseTime();//Время заткрытия ордера
         if(R>0.0 && OP<TimeCurrent())//Если больше 0,0
           {
            _Lot1=_Lot1*2;//вычисояем новый лот
            Print("Тикет ордера =",T,"Приболь ордера =",R,"Лот следующего ордера=",_Lot1);
           }
         else
            if(R<0.0 && OP<TimeCurrent())//Если меньше 0,0
              {
               _Lot1=Lot0;//вычисояем новый лот
               Print("Тикет ордера =",T,"Приболь ордера =",R,"Лот следующего ордера=",_Lot1);
              }
        }
     }
   return(_Lot1);//Возваращаем полученный лот
  }

Как с этим вариантом? Здравствуйте.
 

Ugar

Гуру форума
Код:
double LOTR1()
  {
   /* Изменение лота если прошлый ордер в истории прибольный или убыточный*/
   for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         double R = OrderProfit();//Приболь выбанного ордера из истории
         double T = OrderTicket();//Тикет с приболью(может и отрицательной) выбанного ордера из истории
         datetime OP = OrderCloseTime();//Время заткрытия ордера
         if(R>0.0 && OP<TimeCurrent())//Если больше 0,0
           {
            _Lot1=_Lot1*2;//вычисояем новый лот
            Print("Тикет ордера =",T,"Приболь ордера =",R,"Лот следующего ордера=",_Lot1);
           }
         else
            if(R<0.0 && OP<TimeCurrent())//Если меньше 0,0
              {
               _Lot1=Lot0;//вычисояем новый лот
               Print("Тикет ордера =",T,"Приболь ордера =",R,"Лот следующего ордера=",_Lot1);
              }
        }
     }
   return(_Lot1);//Возваращаем полученный лот
  }

Как с этим вариантом? Здравствуйте.
Условие OP<TimeCurrent() бесполезно
Код:
double LOTR1()
  {
   /* Изменение лота если прошлый ордер в истории прибольный или убыточный*/
   datetime TimeLastCloseOrder=0;
   for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
        datetime OP = OrderCloseTime();//Время заткрытия ордера
        if(TimeLastCloseOrder<OP)
            {
            TimeLastCloseOrder=OP;
             double R = OrderProfit();//Приболь выбанного ордера из истории
             double T = OrderTicket();//Тикет с приболью(может и отрицательной) выбанного ордера из истории
            if(R>0.0)//Если больше 0,0
                {
                _Lot1=_Lot1*2;//вычисояем новый лот
                Print("Тикет ордера =",T,"Приболь ордера =",R,"Лот следующего ордера=",_Lot1);
                }
            else if(R<0.0 && OP<TimeCurrent())//Если меньше 0,0
                {
                _Lot1=Lot0;//вычисояем новый лот
                Print("Тикет ордера =",T,"Приболь ордера =",R,"Лот следующего ордера=",_Lot1);
                }
             }
        }
     }
   return(_Lot1);//Возваращаем полученный лот
  }
Как то так. Код не проверял. Это просто намёк как искать последний закрытый.
 

star603

Новичок форума
Код:
void OnTick()
  {
   if(OrdersTotal()==0)
     {
      uo(svecha);
      if(svecha[4][1]>0 && svecha[4][2]>0 && svecha[4][3]>0)//3 бычие свечи
        {
         double SL = NormalizeDouble(Ask+StopLoss*Point,Digits);//Стоплос =250
         double TP = NormalizeDouble(Bid-TakeProfit*Point,Digits);//Тейкпрофит 500
         Print("SL=",SL,"TP=",TP,"Ask=",Ask,"Bid=",Bid);
         ticketss=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,SL,TP,"S1 sell",Magic,clrNONE);
        }
     };
  }

Я понимаю ошибаюсь. До правильного ответа я допру. Я вот чего не понимаю почему стоплос равен аску, а тейкпрофит биду? Хотя не должен быть.

Код:
2022.11.05 16:22:04.941    2004.01.20 00:00:56  Umr3 AUDCAD,H4: SL=0.9927 TP=0.9911 Ask=0.9927 Bid=0.9911
 

griz

Активный участник
Я понимаю ошибаюсь. До правильного ответа я допру. Я вот чего не понимаю почему стоплос равен аску, а тейкпрофит биду? Хотя не должен быть.

Похоже StopLoss и TakeProfit равны 0. Пропиши в Print() StopLoss и TakeProfit и посмотри что в них находится.
 

star603

Новичок форума
Похоже StopLoss и TakeProfit равны 0. Пропиши в Print() StopLoss и TakeProfit и посмотри что в них находится.
реально 0,0 но почему если я указывал вот это:
extern int StopLoss = 250;//Фиксированный уровень стопа
extern int TakeProfit = 500;//Фиксированный уровень профита
 

griz

Активный участник
реально 0,0 но почему если я указывал вот это:
extern int StopLoss = 250;//Фиксированный уровень стопа
extern int TakeProfit = 500;//Фиксированный уровень профита
Ты эти переменные где-то в коде обнулил, напиши так:
input int StopLoss = 250;//Фиксированный уровень стопа
input int TakeProfit = 500;//Фиксированный уровень профита
 

star603

Новичок форума
Ты эти переменные где-то в коде обнулил, напиши так:
input int StopLoss = 250;//Фиксированный уровень стопа
input int TakeProfit = 500;//Фиксированный уровень профита
Это весь код. Только в этом месете стоплосы применяются и все. Я их не обнулял нигде.
Код:
//+------------------------------------------------------------------+
//|                                                         Umr3.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
sinput string iT_Note_3 = " --== Вводимые значения данных ==-- ";
extern int StopLoss = 250;//Фиксированный уровень стопа
extern int TakeProfit = 500;//Фиксированный уровень профита
extern int Magic = 677687;//Уникальный магик
extern int Slippage = 10;//Уровень проскльзования
extern double Lot = 0.01;//Установка текущего лота
extern double RISK = 0.01;//Устанавливаемый риск на сделку
//====================================================================
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(MarketInfo(Symbol(),MODE_DIGITS)==5)
      coeff = 10;
   if(MarketInfo(Symbol(),MODE_DIGITS)==3)
      coeff = 10;
   StopLoss  *= coeff;
   TakeProfit*= coeff;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   Print(StopLoss);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| User function                                                    |
//+------------------------------------------------------------------+
Все лишнее убрал всравно 0 показывает.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Это весь код. Только в этом месете стоплосы применяются и все. Я их не обнулял нигде.
Код:
//+------------------------------------------------------------------+
//|                                                         Umr3.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
sinput string iT_Note_3 = " --== Вводимые значения данных ==-- ";
extern int StopLoss = 250;//Фиксированный уровень стопа
extern int TakeProfit = 500;//Фиксированный уровень профита
extern int Magic = 677687;//Уникальный магик
extern int Slippage = 10;//Уровень проскльзования
extern double Lot = 0.01;//Установка текущего лота
extern double RISK = 0.01;//Устанавливаемый риск на сделку
//====================================================================
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(MarketInfo(Symbol(),MODE_DIGITS)==5)
      coeff = 10;
   if(MarketInfo(Symbol(),MODE_DIGITS)==3)
      coeff = 10;
   StopLoss  *= coeff;
   TakeProfit*= coeff;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   Print(StopLoss);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| User function                                                    |
//+------------------------------------------------------------------+
Все лишнее убрал всравно 0 показывает.
А где объявлен coeff
 

griz

Активный участник
Это весь код. Только в этом месете стоплосы применяются и все. Я их не обнулял нигде.
У меня нет нуля:
C-подобный:
sinput string iT_Note_3 = " --== Вводимые значения данных ==-- ";
extern int StopLoss = 250;//Фиксированный уровень стопа
extern int TakeProfit = 500;//Фиксированный уровень профита
extern int Magic = 677687;//Уникальный магик
extern int Slippage = 10;//Уровень проскльзования
extern double Lot = 0.01;//Установка текущего лота
extern double RISK = 0.01;//Устанавливаемый риск на сделку
int coeff;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(MarketInfo(Symbol(),MODE_DIGITS)==5)
      coeff = 10;
   if(MarketInfo(Symbol(),MODE_DIGITS)==3)
      coeff = 10;
   StopLoss  *= coeff;
   TakeProfit*= coeff;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   Print(StopLoss);
  }
//+------------------------------------------------------------------+
 
Последнее редактирование:
Верх