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

mobidik

-----
А как, если присвоить можно?
Точно так же, как в моем примере выше: StringGetCharacter().
Получили тип ushort, можно привести к int, как вариант, но что это даст?
На счет "много условий": так это еще не много, а так, если они длинные - разбить на части, которые присвоить новым переменным и их уже сравнивать, как в примере выше, может получиться в одну строку...
if(znak=="<") c = a+b; else c = a-b;
 
  • Like
Реакции: ZNV

markos5962237

Прохожий
По алгоритму: ордер открывается при соблюдении запрограммированных условий на открытии/закрытии нового бара (4h). На реальном счете все так и происходит, открытие ордера на открытии/закрытии новой свечи. А при тестировании позиции открываются не зависимо от условия поиска нового бара. Кто назнает в чем проблема?
 

ZNV

Активный участник
Как можно узнать, какой баланс/размер депозита был вчера к примеру?

ps: кроме как суммировать все ордера...
 
Последнее редактирование:

ZNV

Активный участник
По алгоритму: ордер открывается при соблюдении запрограммированных условий на открытии/закрытии нового бара (4h). На реальном счете все так и происходит, открытие ордера на открытии/закрытии новой свечи. А при тестировании позиции открываются не зависимо от условия поиска нового бара. Кто назнает в чем проблема?
А как ты определяешь новый бар?
Если нестируешь на ценах открытия, то там глюки могут быть. Лучше на "всех тиках". И все равно возможно способ определения нового бара проблемный.
 

4budab1

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

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

(хочу все ордера чтобы подтягивало до уровня безубытка
т.е 2-7 SL должны на уровне 7 быть)

Код:
void ClassicTrail()   //1 Вариант: Классический тралл
  {
   for(int i=OrdersTotal(); i >= 0; i--)
     {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        {
           {
            if(OrderStopLoss()!=BreakevenBuy() && (OrderType() == OP_BUY) && (CountBuyPositions()>1))
              {
               OrderModify(OrderTicket(), OrderOpenPrice(), BreakevenBuy(), OrderTakeProfit(),clrNONE);
              }
           }
        }
     }
  }
 

Вложения

  • photo_2022-06-08_08-09-42.jpg
    photo_2022-06-08_08-09-42.jpg
    154,7 КБ · Просмотры: 25
Последнее редактирование:

Ugar

Гуру форума
Помогите люди добрые, просто на ровном месте застрял

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

(хочу все ордера чтобы подтягивало до уровня безубытка
т.е 2-7 SL должны на уровне 7 быть)

Код:
void ClassicTrail()   //1 Вариант: Классический тралл
  {
   for(int i=OrdersTotal(); i >= 0; i--)
     {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        {
           {
            if(OrderStopLoss()!=BreakevenBuy() && (OrderType() == OP_BUY) && (CountBuyPositions()>1))
              {
               OrderModify(OrderTicket(), OrderOpenPrice(), BreakevenBuy(), OrderTakeProfit(),clrNONE);
              }
           }
        }
     }
  }
Странно что он вообще что то делает. Последний ордер OrdersTotal()-1, а не OrdersTotal().
for(int i=OrdersTotal()-1; i >= 0; i--)
Ну и не помешает, перед отправкой приказа модификации, проверить нужна ли модификация, а то может стоп уже там где нужно.
 
Последнее редактирование:

4budab1

Новичок форума
Странно что он вообще что то делает. Последний ордер OrdersTotal()-1, а не OrdersTotal().
for(int i=OrdersTotal()-1; i >= 0; i--)
Ну и не помешает, перед отправкой приказа модификации, проверить нужна ли модификация, а то может стоп уже там где нужно.
Breakeven Price 1.276
Почему останавливается на первом ордере (#2) со SL 1.233 и не хочет его на 1.276 двигать?🙄

Вот вырезка получается что используется, полный код советника в атаче
Код:
void OnTick()
{
..
ClassicTrail();
..
}

...


double BreakevenBuy()
  {
   double SummBuyLots_Prices=0;
   double SummLots=0;
   double AvereageBuyLevel=0;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(!OrderSelect(i,SELECT_BY_POS))
         continue;
      if(OrderType()!=OP_BUY || OrderSymbol()!=Symbol() || OrderMagicNumber()=="")
         continue;
        {
         SummLots+=OrderLots();
         SummBuyLots_Prices+=OrderLots()*OrderOpenPrice();
        }
     }
   if(SummLots>0)
     {
      AvereageBuyLevel=SummBuyLots_Prices/SummLots;
      AvereageBuyLevel=NormalizeDouble(AvereageBuyLevel,4);
     }
   return (AvereageBuyLevel);
  }


...


void ClassicTrail()
  {
   for(int i=OrdersTotal()-1; i >= 0; i--)
     {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        {
           {
            if(OrderStopLoss()!=BreakevenBuy() && (OrderType() == OP_BUY) && (CountBuyPositions()>1))
              {
               Print (OrderTicket());
               Print (OrderStopLoss());
               OrderModify(OrderTicket(), OrderOpenPrice(), BreakevenBuy(), OrderTakeProfit(),clrNONE);
              }
           }
        }
     }
  }
 

Вложения

  • 11.mq4
    48,8 КБ · Просмотры: 18

Ugar

Гуру форума
Breakeven Price 1.276
Почему останавливается на первом ордере (#2) со SL 1.233 и не хочет его на 1.276 двигать?🙄

Вот вырезка получается что используется, полный код советника в атаче
Код:
void OnTick()
{
..
ClassicTrail();
..
}

...


double BreakevenBuy()
  {
   double SummBuyLots_Prices=0;
   double SummLots=0;
   double AvereageBuyLevel=0;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(!OrderSelect(i,SELECT_BY_POS))
         continue;
      if(OrderType()!=OP_BUY || OrderSymbol()!=Symbol() || OrderMagicNumber()=="")
         continue;
        {
         SummLots+=OrderLots();
         SummBuyLots_Prices+=OrderLots()*OrderOpenPrice();
        }
     }
   if(SummLots>0)
     {
      AvereageBuyLevel=SummBuyLots_Prices/SummLots;
      AvereageBuyLevel=NormalizeDouble(AvereageBuyLevel,4);
     }
   return (AvereageBuyLevel);
  }


...


void ClassicTrail()
  {
   for(int i=OrdersTotal()-1; i >= 0; i--)
     {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        {
           {
            if(OrderStopLoss()!=BreakevenBuy() && (OrderType() == OP_BUY) && (CountBuyPositions()>1))
              {
               Print (OrderTicket());
               Print (OrderStopLoss());
               OrderModify(OrderTicket(), OrderOpenPrice(), BreakevenBuy(), OrderTakeProfit(),clrNONE);
              }
           }
        }
     }
  }
Ладно, по поводу специально создаваемых тормозов промолчу.
Возможно дело в погрешностях вычисления и хранения double.
OrderStopLoss()!=BreakevenBuy()
Так делать нельзя.
Чуть выше функция ClassicTrail(). В ней применена нормализация. Я бы учёл погрешности без нормализации, но и так пойдёт.
 

4budab1

Новичок форума
Ладно, по поводу специально создаваемых тормозов промолчу.
Возможно дело в погрешностях вычисления и хранения double.
OrderStopLoss()!=BreakevenBuy()
Так делать нельзя.
Чуть выше функция ClassicTrail(). В ней применена нормализация. Я бы учёл погрешности без нормализации, но и так пойдёт.
Честно я как рыбой об лед бьюсь, даже с тормозами, с кодом в лоб все равно выходит error modify 1
Можете подсказать как бы вы написали?
Так тоже error 1 вываливает
Код:
double CurrentStopLong = NormalizeDouble(OrderStopLoss(),Digits);
double BreakEvenLong = NormalizeDouble(BreakevenBuy(),Digits);
if(CurrentStopLong<=BreakEvenLong)
{
    OrderModify(OrderTicket(), OrderOpenPrice(), BreakEvenLong, OrderTakeProfit(),0,clrNONE);
}
Функция которые выше BreakevenBuy() как я понимаю нормально работает.

Бесит конечно дико когда такая вроде бы мелочь, а все равно скилла не хватает написать
 
Последнее редактирование:

Ugar

Гуру форума
Честно я как рыбой об лед бьюсь, даже с тормозами, с кодом в лоб все равно выходит error modify 1
Можете подсказать как бы вы написали?
Так тоже error 1 вываливает
Код:
double CurrentStopLong = NormalizeDouble(OrderStopLoss(),Digits);
double BreakEvenLong = NormalizeDouble(BreakevenBuy(),Digits);
if(CurrentStopLong<=BreakEvenLong)
{
    OrderModify(OrderTicket(), OrderOpenPrice(), BreakEvenLong, OrderTakeProfit(),0,clrNONE);
}
Функция которые выше BreakevenBuy() как я понимаю нормально работает.

Бесит конечно дико когда такая вроде бы мелочь, а все равно скилла не хватает написать
Обычно error 1 означает что отправлен приказ выполнить то что уже выполнено. Например если отправляется приказ переставить стоп на тот же уровень, где он уже находится.
Код:
double CurrentStopLong = OrderStopLoss();

double BreakEvenLong = BreakevenBuy();

if(MathAbs(CurrentStopLong-BreakEvenLong)>0.5*_Point)

{

    if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(BreakEvenLong,Digits), OrderTakeProfit(),0,clrNONE))
        Print(__FUNCTION__," Error=",_LastError);

}
 

egor008

Активный участник
Честно я как рыбой об лед бьюсь, даже с тормозами, с кодом в лоб все равно выходит error modify 1
Можете подсказать как бы вы написали?
Так тоже error 1 вываливает
Код:
double CurrentStopLong = NormalizeDouble(OrderStopLoss(),Digits);
double BreakEvenLong = NormalizeDouble(BreakevenBuy(),Digits);
if(CurrentStopLong<=BreakEvenLong)
{
    OrderModify(OrderTicket(), OrderOpenPrice(), BreakEvenLong, OrderTakeProfit(),0,clrNONE);
}
Функция которые выше BreakevenBuy() как я понимаю нормально работает.

Бесит конечно дико когда такая вроде бы мелочь, а все равно скилла не хватает написать




PHP:
void ClassicTrail_2(){ 
   //+-----------------------------------------------------------------------------------------------------+

     double stop_level = MarketInfo(Symbol(),MODE_STOPLEVEL);

     double  SL_price = BreakevenBuy();

    for (int i=0; i<OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { 
        if(OrderType()==OP_BUY){
         if(OrderStopLoss() != SL_price  && Bid > SL_price+stop_level*Point ){ 
            bool mod =   OrderModify(OrderTicket(),OrderOpenPrice(),SL_price,OrderTakeProfit(),0,clrViolet); 
            }
          }
        } 
      }
   //+-----------------------------------------------------------------------------------------------------+ 
    }


Модифицирует все стопы, на цену BreakevenBuy().

BreakevenBuy() - может сгенерировать цену_Безубытка выше Bid. Поэтому включено услoвие Bid > SL_price

И ешё, к условию, нужно добавить отступ. Иначе позиции закрываемые по безубытку, будут с минусовой прибылью.

Вот так: Bid > SL_price+(ОТСТУП+stop_level)*Point // Но, на ваше усмотрение конечно.

Тогда позы закрываемые по безубытку будут в плюсе.

п.с.

А вообще, логика отвратительная, смотреть на это безумство, невозможно. И проверить функцию, не представилось возможным. Вероятно у вас какие-то особенные настройки.

Поэтому пришлось делать сов, для проверки работы функции, на бай позициях.

Проверяйте.
 

Вложения

  • test_2.ex4
    11,4 КБ · Просмотры: 9

egor008

Активный участник
В самой функции BreakevenBuy() если добавить OTSTUP,

То минусового профита не будет.

PHP:
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+ OTSTUP
double BreakevenBuy()
  {
   double SummBuyLots_Prices=0;
   double SummLots=0;
   double AvereageBuyLevel=0;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(!OrderSelect(i,SELECT_BY_POS))
         continue;
      if(OrderType()!=OP_BUY || OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic)
         continue;
        {
         SummLots+=OrderLots();
         SummBuyLots_Prices+=(OrderLots()*OrderOpenPrice());
        }
     }
   if(SummLots>0)
     {
      AvereageBuyLevel= SummBuyLots_Prices/SummLots;
      AvereageBuyLevel=NormalizeDouble(AvereageBuyLevel+OTSTUP*Point,4);
     }
   return (AvereageBuyLevel);
  }
//+------------------------------------------------------------------+


_02.jpg

Проверка на М1
EURUSD
Депозит 10 000
Лот 0.01
 

Вложения

  • test_3.ex4
    27,5 КБ · Просмотры: 12

AlexeNP

Гуру форума
Вся эта возня вокруг BreakevenBuy() выеденного яйца не стоит... Нужно только вспомнить, что Buy открывается по цене Ask, а закрывается по цене Bid. Дальше, вспоминаем про проскальзывание, оно минимально равно спреду. Значит между ценой открытия и Breakeven каждой из позиций должен быть минимум спред....
 

egor008

Активный участник
Вся эта возня вокруг BreakevenBuy() выеденного яйца не стоит... Нужно только вспомнить, что Buy открывается по цене Ask, а закрывается по цене Bid. Дальше, вспоминаем про проскальзывание, оно минимально равно спреду. Значит между ценой открытия и Breakeven каждой из позиций должен быть минимум спред....
)))😊 Ет точно.)) А для экспериментов, нужна другая ветка.))
 

missha32

Интересующийся
Вечер добрый . Помогите разобраться как код текстового символа перекодировать в utf 8 hex .
 

блондинка

Элитный участник
куда то нажала(на клавиатуре)
и текст в метаэдиторе стал таким
куда нажать для нормализации?
это изображение всего рабочего стола
 

Вложения

  • Screenshot_12.png
    Screenshot_12.png
    72,8 КБ · Просмотры: 25

AlexeyVik

Программист mql4 mql5
куда то нажала(на клавиатуре)
и текст в метаэдиторе стал таким
куда нажать для нормализации?
это изображение всего рабочего стола
Прокрутка колёсика крыски с зажатым Ctrl изменяет размер шрифта.
 

ZNV

Активный участник
Здравствуйте.
....замучился.. Нужно что бы в заданном таймфрейме с открытием нового бара выполнялось что то...
Не работает ни тот ни другой вариант.
Нужны оба 2 варианта... укажите на ошибку пжлста.

C-подобный:
if(    ( TimeCurrent() - iTime(pr[0],tf[0],0) ) < 10    )
{
...........    // тут открываю ордер в начале бара
}

и

C-подобный:
int mag = TFrame;       //-- magik

               for(int i=OrdersTotal()-1;i>=0;i--)
               {
                  f = OrderSelect(i, SELECT_BY_POS)
                  if( iTime(Symb,TFrame,0)>OrderOpenTime() && OrderMagicNumber()==mag && TFrame==mag )
                  {
                       ..............   // тут закрываю ордер на следующем баре.
                  }
            }


ps: маджик нормально прописываеться
 
Последнее редактирование:
Верх