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

on220

Интересующийся
Надо то всего не по пунктам увеличивать размер лота,а на каждом пересечении стохастика уровня 50.Спасибо
 

vladradon

Программист
vladradon,
Вот код(походу ваших рук дело)
Я вспомнил этот код с fxgeneral, только там код был рабочий, а этот полный хлам, т.к. в него кто-то влез без понятия, что делает. Я разгребать его не буду! Он только при компиляции выдает 48 ошибок!!! Не предупреждений, а ошибок! Это как надо было рабочий код убить?
 
Последнее редактирование:

on220

Интересующийся
vladradon,
Смысл не плохой этой вариации если только во флете.
 

on220

Интересующийся
vladradon,
Кстати ну не знаю в моем случае ошибок 0 предупреждения одни.
 

vladradon

Программист
vladradon,
Кстати ну не знаю в моем случае ошибок 0 предупреждения одни.
Вот 2 варианта: первый, что я скопировал с этой страницы и перенес в сова и второй - тот, что я сейчас у себя нашел (что странно, т.к. этому хламу сто лет и это не мой хлам - я просто над ним экспериментировал давным давно). Свой я сейчас поправил - убрал все предупреждения и ошибок в нем не было. Но стохастиком не занимался. Может eevviill2 найдет время - теперь это не сложно будет.
 

Вложения

  • MAEXOLD.mq4
    20,4 КБ · Просмотры: 28
  • MartingailExpertStochastic_v22.0 margin.mq4
    24,3 КБ · Просмотры: 25

on220

Интересующийся
vladradon,
так я тоже стохастик как пример лишь привел,и машку так же.ладно доброго всего.
 

on220

Интересующийся
Добрый день!
Нашел тут на просторах подсказку,не много хочу под себя её подстроить. но ....
Хотелось бы,чтоб по первой прибыльной сделке, вернулся стартовый лот,ну и явно там что-то да не корректно хоть и ошибок вроде нет.Если не затруднит помогите.Надеюсь это не сложно будет как для меня.Спасибо кто поправит.само собой.
double Lots()
{
double Lot=Lots;
int OO = OrdersTotal();
if(OO > 0)
for (int j = OO-1;j>=0; j--)
{
if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == 111)
{
if(OrderLots() > Lots)
{
Lots= OrderLots() ;
}

{
Lot=Lots*mult;
}
 

on220

Интересующийся
Пропустил маленько.Вот на сякий случай.
extern double mult = 1.5;
extern double Lots = 0.1;
а это в конце функции
}
}

return(Lot);
}
 

AlexeyVik

Программист mql4 mql5
Добрый день!
Нашел тут на просторах подсказку,не много хочу под себя её подстроить. но ....
Хотелось бы,чтоб по первой прибыльной сделке, вернулся стартовый лот,ну и явно там что-то да не корректно хоть и ошибок вроде нет.Если не затруднит помогите.Надеюсь это не сложно будет как для меня.Спасибо кто поправит.само собой.
double Lots()
{
double Lot=Lots;
int OO = OrdersTotal();
if(OO > 0)
for (int j = OO-1;j>=0; j--)
{
if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == 111)
{
if(OrderLots() > Lots)
{
Lots= OrderLots() ;
}

{
Lot=Lots*mult;
}

Пропустил маленько.Вот на сякий случай.
extern double mult = 1.5;
extern double Lots = 0.1;
а это в конце функции
}
}

return(Lot);
}
Чтобы по первой прибыльной сделке что-либо сделать нужно определить прибыльна-ли сделка. А в этом коде такой проверки нету.
 

vladradon

Программист
Если не затруднит помогите.
Привет. Чирканул функцию по-быстрому. Только вопрос: что должна возвращать функция, если нет плюсового закрытого ордера и нет ордеров в рынке на данный момент (последний return). Я поставил возврат начального лота, получается. Но может нужно будет возвращать 0 - нужно по стратегии продумать!
PHP:
double LotS()
 {
  double Lot=Lots;
  if(OrdersHistoryTotal()>0)
     for(int i=OrdersHistoryTotal()-1; i>=0; i--)
        if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
          if(OrderSymbol()==_Symbol && OrderMagicNumber()==111)
            if(OrderProfit()>0) return(Lot);

   for(int j=OrdersTotal()-1; j>=0; j--)
       if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES))
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==111)
           if(OrderLots()>Lots) Lot=OrderLots()*mult;
     
  return(Lot);
 }
 

vladradon

Программист
Чирканул функцию по-быстрому.
Еще у меня сомнение, что нужна последняя проверка в строке
PHP:
if(OrderLots()>Lots) Lot=OrderLots()*mult;
скорее всего нужно оставить просто
PHP:
Lot=OrderLots()*mult;
иначе при одном ордере в рынке с базовым лотом функция не будет умножать лот для второго ордера. Я просто взял начальный код и не знаю, зачем в нем была эта проверка, поэтому оставил.
И еще было бы логично возвращать базовый лот при последнем плюсовом закрытом, если нет в рынке ордеров, т.е. ввести сначала проверку на наличие ордеров в рынке, потом, если их еще нет, проверить профит последнего закрытого. Я не знаю общего алгоритма, поэтому тупо гадаю сейчас.
 
Последнее редактирование:

on220

Интересующийся
vladradon,
Добрый день!
Спасибо,но к сожалению функция не множит. По поводу логики;ну да,закрылся ордер плюсом,то возврат на стартовый лот.При закрытии последнего общий профит в плюсе закроются и предыдущие .Но это уже другая функция.
 

vladradon

Программист
Спасибо,но к сожалению функция не множит.
Она не множит из-за проверки, которую я рекомендовал убрать во втором сообщении. Вообще правильнее было бы так:
PHP:
double LotS()
  {
   double Lot=Lots;
   int Or=0;
   for(int a=0; a>OrdersTotal(); a++)
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==111)
            Or++;
   if(OrdersHistoryTotal()>0 && Or==0)
      for(int i=OrdersHistoryTotal()-1; i>=0; i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
            if(OrderSymbol()==_Symbol && OrderMagicNumber()==111)
               if(OrderProfit()>0) return(Lot);
   if(Or>0)
      for(int j=OrdersTotal()-1; j>=0; j--)
         if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES))
            if(OrderSymbol()==_Symbol && OrderMagicNumber()==111)
               {Lot=OrderLots()*mult; break;}

   return(Lot);
  }
И вопрос: что должна возвращать функция, если последний ордер отриательный? Ведь закрытие серии ордеров может быть разного направления. Если закрывать в цикле от 0 до последнего, то последний будет положительным в большинстве случаев, а если от последнего к первому, то отрицательным. Вообще обычно не считают от положительного или нет - просто если нет в рынке ордеров, то стартуем базовым лотом, если есть, то множим последний:
PHP:
double LotS()
  {
   double Lot=Lots;
   int Or=0;
   for(int a=0; a>OrdersTotal(); a++)
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==111)
            Or++;
    if(Or>0)
      for(int j=OrdersTotal()-1; j>=0; j--)
         if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES))
            if(OrderSymbol()==_Symbol && OrderMagicNumber()==111)
               {Lot=OrderLots()*mult; break;}
   return(Lot);
  }
И нужно еще нормализовать полученный лот перед открытием ордера.
 
Последнее редактирование:

ivansss

Новичок форума
Добрый день. Вопрос про удаленный контроль. Предположим у меня сова на управленческом счете висит и высылает мне на мыло сообщения в случае нарушения.
1) Как поставить пароль, чтобы он не смог поменять настройки extern?(Чтобы он мог через пользовательское меню их видеть, но изменять их только после пароля)
2) Как заставить сов высылать сообщение об отключении почты в настройках? Ведь собственно можно банально обрубить связь в настройках
 

on220

Интересующийся
vladradon,
Добрый день!
Благодарствую в очередной раз!!Поддержали помогли.
Каждый вариант для конкретной ведь ситуации и системы.,за оба от души спасибо.
 

Ugar

Гуру форума
Господа,

Очень нужна помощь. Имеется индикатор, очень простой и всем, наверное, известный: Trend Magic. Основан на двух стандартных индикаторах: CCI(50) и ATR(5). Рисует очень красивые линии на графике. У меня, как чайника в программировании, имеется вопрос: как из значений CCI и ATR получается значение, которое отображается на графике цены и по которому рисуется эта самая линия? Можете вывести формулу?
Упрощенно.
Если CCI пересекла 0 вверх, индикатор имеет значение Low бара - ATR.
Если CCI пересекла 0 вниз, индикатор имеет значение High бара + ATR.
 

eevviill2

Местный знаток
Он не будет работать по всем символам одновременно! -Только на том, на котором стоит.
PHP:
ObjectCreate(0,name,OBJ_HLINE,0,0,price);
- 0-идентификатор графика в терминале и у тебя только текущий указан (0). Чтобы трал работал по всем открытым графикам, нужно считывать ID графика и по нему уже рисовать линию на нужном графике, а не на текущем. Только я однажды пытался сделать считывание ID открытых графиков и терминал выдавал только 0 первого графика, а все остальные были EMPTY и фиг, что дальше сделаешь. Поэтому я нашел другой способ виртуального трала по всем ордерам всех графиков - думай дальше, студент.;):D
Ачо нельзя на текущем графике нарисовать линии от другого символа?
Что на графике EURUSD нету цены от GBPUSD:laugh:
 

eevviill2

Местный знаток
Если условие не имеет эффекта, то какого Алерт показал 7?:laugh:
PHP:
expression has no effect
PHP:
double numb1=7;double numb2=4;double val=0;numb1>numb2?val=numb1:val=numb2;Alert(val);
 
Последнее редактирование модератором:
Верх