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

vladradon

Программист
Всем привет, подскажите пожалуйста как вбить в советник следующее условие :

Если сработал отложенный ордер на покупку(ticket), тогда выставить новый отложенный ордер на продажу(ticket2) на уровень стоп лоса сработавшего отложенного ордера на покупку(ticket).

Аналогично для отложенного ордера на продажу(ticket1).
Если сработал отложенный ордер на продажу(ticket1), тогда выставить новый отложенный ордер на покупку(ticket3) на уровень стоп лоса сработавшего отложенного ордера на продажу(ticket1).

И так далее для будущих ticket2, ticket3 если они сработают. То есть если они сработают выставить новые отложенники на их уровень стоплосса.
Если ты используешь мной выложенный алгоритм, то просто в кривых скобках после удаления вставь команду открытия нового отложенника с нужным отступом в параметрах с новыми ticket-ами, которые можно в аналогичной проверке использовать дальше, только, возможно, еще одно условие добавив типа if (ticket2>0) и т.д., предварительно обнулив при старте все переменные тикеты. Но это, конечно, самый простой вариант, который просто даст понять, что стратегия сливная, как это бывает в 99% случаев...)))А если не сливатор, то нужно будет уже все делать в цикле с доп. флаговыми переменными и это уже будет рабочий алгоритм.))))
 
  • Like
Реакции: Conn

Conn

Активный участник
Ну так ты уже выбрал ордер, определил что он Buy или Sell, пиши открытие.

Выбрал ордер, определил что Buy и Sell. Далее, не знаю как установить уровень для нового отложенного ордера который определяется стоп лосом уже открытого ордера.

Думаю ты знаешь что так пишут только для работы в тестере.

К сожалению не знаю, что имеется ввиду...
 

Conn

Активный участник
Если ты используешь мной выложенный алгоритм, то просто в кривых скобках после удаления вставь команду открытия нового отложенника с нужным отступом в параметрах с новыми ticket-ами

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


Но это, конечно, самый простой вариант, который просто даст понять, что стратегия сливная, как это бывает в 99% случаев...)))А если не сливатор, то нужно будет уже все делать в цикле с доп. флаговыми переменными и это уже будет рабочий алгоритм.))))

Цель не написать прибыльную или сливную сову, Просто пытаюсь написать советник с целью обучения языка mql, для примера взял такой простой алгоритм. Хочу для начала его освоить, а потом постепенно планирую добавить индикаторы в условие...
 

Ugar

Гуру форума
Выбрал ордер, определил что Buy и Sell. Далее, не знаю как установить уровень для нового отложенного ордера который определяется стоп лосом уже открытого ордера.



К сожалению не знаю, что имеется ввиду...
Стоп лосс выбранного ордера OrderStopLoss()
 
  • Like
Реакции: Conn

vladradon

Программист
Спасибо большое за отклик и помощь, да использую выложенный вами алгоритм. В целом понятно, но вот только нужный отступ не знаю как определить советником.
Я тем более не знаю - это же твой алгоритм!))) Отступ может быть нужно считать от текущего Bidа - я не могу помочь, не зная что в результате мы должны получить. Можешь в скайп ко мне обратиться, чтобы ветку не засорять - ник тот же.
 
  • Like
Реакции: Conn

Conn

Активный участник
Стоп лосс выбранного ордера OrderStopLoss()

Прошу не судить строго и не смеется если код выглядит на три с минусом. :please:

Ругается при компиляций, в поле price прописал OrderStopLoss(ticket1) чтобы отложенный ордер ticket3 установился на уровень стоп лосса открытого ордера ticket1.


if (OrdersTotal()==0)
{

lot1=0.1;
lot2=0.1;
lot3=0.1;
lot4=0.1;
lot5=0.1;
c=Ask+P*Point;
c1=Bid-P*Point;
ticket1=OrderSend(Symbol(),OP_BUYSTOP,lot1,c,3,c-(sl)*Point,c+(tp)*Point," ",16384,0, Blue );
ticket2=OrderSend(Symbol(),OP_SELLSTOP,lot1,c1,3,c1+(sl)*Point,c1-(tp)*Point," ",16384,0, Red );

//----
}
//----
bool b;
for (int i = OrdersTotal()-1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber() == 16384 )
{
if (OrderType() == OP_BUY && OrderTicket()==ticket1) {b=OrderDelete(ticket2); break;}
{
ticket3=OrderSend(Symbol(),OP_SELLSTOP,lot1,OrderStopLoss(ticket1),3,c1+(sl)*Point,c1-(tp)*Point," ",16384,0, Red );
}
 

Вложения

  • Безымянный.png
    Безымянный.png
    75 КБ · Просмотры: 15
  • новый - копия.mq4
    2,4 КБ · Просмотры: 19

Ugar

Гуру форума
Прошу не судить строго и не смеется если код выглядит на три с минусом. :please:

Ругается при компиляций, в поле price прописал OrderStopLoss(ticket1) чтобы отложенный ордер ticket3 установился на уровень стоп лосса открытого ордера ticket1.


if (OrdersTotal()==0)
{

lot1=0.1;
lot2=0.1;
lot3=0.1;
lot4=0.1;
lot5=0.1;
c=Ask+P*Point;
c1=Bid-P*Point;
ticket1=OrderSend(Symbol(),OP_BUYSTOP,lot1,c,3,c-(sl)*Point,c+(tp)*Point," ",16384,0, Blue );
ticket2=OrderSend(Symbol(),OP_SELLSTOP,lot1,c1,3,c1+(sl)*Point,c1-(tp)*Point," ",16384,0, Red );

//----
}
//----
bool b;
for (int i = OrdersTotal()-1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber() == 16384 )
{
if (OrderType() == OP_BUY && OrderTicket()==ticket1) {b=OrderDelete(ticket2); break;}
{
ticket3=OrderSend(Symbol(),OP_SELLSTOP,lot1,OrderStopLoss(ticket1),3,c1+(sl)*Point,c1-(tp)*Point," ",16384,0, Red );
}
Если бы код выглядел на 3 с минусом, он бы компилировался и кое как работал. Пока что до 3- он не дотягивает.
OrderStopLoss() без аргументов, вернёт стоп лосс ордера, который был выбран функцией OrderSelect
У тебя условие
if (OrderType() == OP_BUY && OrderTicket()==ticket1)
После него в фигурных скобках, что нужно выполнить, по этому условию.
То есть у тебя там {b=OrderDelete(ticket2); break;}
Туда же, нутрь этих скобок надо засунуть открытие ордера.
 

Rennela

Новичок форума
Прошу не судить строго и не смеется если код выглядит на три с минусом. :please:

Ругается при компиляций, в поле price прописал OrderStopLoss(ticket1) чтобы отложенный ордер ticket3 установился на уровень стоп лосса открытого ордера ticket1.


if (OrdersTotal()==0)
{

lot1=0.1;
lot2=0.1;
lot3=0.1;
lot4=0.1;
lot5=0.1;
c=Ask+P*Point;
c1=Bid-P*Point;
ticket1=OrderSend(Symbol(),OP_BUYSTOP,lot1,c,3,c-(sl)*Point,c+(tp)*Point," ",16384,0, Blue );
ticket2=OrderSend(Symbol(),OP_SELLSTOP,lot1,c1,3,c1+(sl)*Point,c1-(tp)*Point," ",16384,0, Red );

//----
}
//----
bool b;
for (int i = OrdersTotal()-1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber() == 16384 )
{
if (OrderType() == OP_BUY && OrderTicket()==ticket1) {b=OrderDelete(ticket2); break;}
{
ticket3=OrderSend(Symbol(),OP_SELLSTOP,lot1,OrderStopLoss(ticket1),3,c1+(sl)*Point,c1-(tp)*Point," ",16384,0, Red );
}
Я бы приблизительно так написал:
PHP:
int StopLoss=100,TakeProfit=100;
int X,Y,W,V,Z,oss,obs;
double slb,sls,sl,tp,tb,ts;
double lot=0.01;
int start()
  {
  RefreshRates();
  for(int i=OrdersTotal();i>=0;i--)
    {
    if(OrderSelect(i,SELECT_BY_POS)==true)
      {
      if(OrderSymbol()!=Symbol())continue;
      if(OrderType()==OP_BUY)
        {
        X=1;
        slb=OrderStopLoss();
        }
      if(OrderType()==OP_SELL)
        {
        Y=2;
        sls=OrderStopLoss();
        }
      if(OrderType()==OP_BUYSTOP)Z=10;
      if(OrderType()==OP_SELLSTOP)W=20;  
      }
    }
  V=X+Y+Z+W;
  if(V==12||V==21)Comment("Ждем");
  if(V==1)
    {
    while(true)
      {
      sl=NormalizeDouble(slb+StopLoss*Point,Digits);
      tp=NormalizeDouble(slb-TakeProfit*Point,Digits);
      oss=OrderSend(Symbol(),OP_SELLSTOP,lot,slb,0,sl,tp); 
      if(oss>0)break;
      }
    }
  if(V==2)
    {
    while(true)
      {
      sl=NormalizeDouble(sls-StopLoss*Point,Digits);
      tp=NormalizeDouble(sls+TakeProfit*Point,Digits);
      obs=OrderSend(Symbol(),OP_BUYSTOP,lot,sls,0,sl,tp);
      if(obs>0)break;
      }         
    }
  V=0;X=0;Z=0;Y=0;W=0;
  return(0);
  }
Если с magic, то я бы еще предварительный блок написал,т.к. не факт что уже открытый ордер имеет magic.
 
  • Like
Реакции: Conn

maximuson

Новичок форума
Народ помогите как дописать условия по Bollinger Bands:

1-закрытие Sell-свечи
2-закрытие Buy-свечи под линией Bollinger ---- открытие Buy-ордера

и наоборот

1-закрытие Buy-свечи
2-закрытие Sell-свечи над линией Bollinger---- открытие Sell-ордера

if (UseBollinger)
{
double BandsUp = iBands(Symbol(), 0, BandsPeriod, BandsDeviation, BandsShift, BandsPrice, MODE_UPPER, 1);
double BandsDn = iBands(Symbol(), 0, BandsPeriod, BandsDeviation, BandsShift, BandsPrice, MODE_LOWER, 1);
if (Close[1] < BandsDn) // Buy Signal
Signal++;
if (Close[1] > BandsUp) // Sell Signal
Signal--;
}
 

Вложения

  • ии.jpg
    ии.jpg
    18,1 КБ · Просмотры: 13
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Народ помогите как дописать условия по Bollinger Bands:

1-закрытие Sell-свечи
2-закрытие Buy-свечи под линией Bollinger ---- открытие Buy-ордера

и наоборот

1-закрытие Buy-свечи
2-закрытие Sell-свечи над линией Bollinger---- открытие Sell-ордера

if (UseBollinger)
{
double BandsUp = iBands(Symbol(), 0, BandsPeriod, BandsDeviation, BandsShift, BandsPrice, MODE_UPPER, 1);
double BandsDn = iBands(Symbol(), 0, BandsPeriod, BandsDeviation, BandsShift, BandsPrice, MODE_LOWER, 1);
if (Close[1] < BandsDn) // Buy Signal
Signal++;
if (Close[1] > BandsUp) // Sell Signal
Signal--;
}
Примерно так

Код:
if (UseBollinger)
   {
    double BandsUp = iBands(Symbol(), 0, BandsPeriod, BandsDeviation, BandsShift, BandsPrice, MODE_UPPER, 1); 
    double BandsDn = iBands(Symbol(), 0, BandsPeriod, BandsDeviation, BandsShift, BandsPrice, MODE_LOWER, 1); 
    if (Open[2] > Close[2] && Open[1] < Close[1] && [COLOR=Red]Close[1] < BandsDn[/COLOR])                                                 // Buy Signal
      Signal++;
    if (Open[2] < Close[2] && Open[1] > Close[1] && [COLOR=Red]Close[1] > BandsUp[/COLOR])                                                // Sell Signal
      Signal--;
   }
 

ivansss

Новичок форума
Уважаемые программисты, у меня есть цикл с поиском максимального значения , но мне нужно еще найти второе максимальное значение , которое меньше первого, как это сделать? Можно ли это сделать через масив? Напишите небольшой пример пожалуйста, заранее уже благодарен.:)
 

eevviill2

Местный знаток
Уважаемые программисты, у меня есть цикл с поиском максимального значения , но мне нужно еще найти второе максимальное значение , которое меньше первого, как это сделать? Можно ли это сделать через масив? Напишите небольшой пример пожалуйста, заранее уже благодарен.:)
PHP:
int numbers[4]={3,6,1,9};
ArraySort(numbers);
Alert(numbers[ArraySize(numbers)-1]); //max number
Alert(numbers[MathMax(ArraySize(numbers)-2,0)]);//pre last number
 
Последнее редактирование:

ivansss

Новичок форума
PHP:
int numbers[4]={3,6,1,9};
ArraySort(numbers);
Alert(numbers[ArraySize(numbers)-1]); //max number
Alert(numbers[MathMax(ArraySize(numbers)-2,0)]);//pre last number

for(int i = 0;i<5;i++)
{ double numbers[5]=GetExtremumZZPrice(i);}
ArraySort(numbers);
Alert(numbers[ArraySize(numbers)-1]); //max number
Alert(numbers[MathMax(ArraySize(numbers)-2,0)]);//pre last number

Не работает, не врубаю я, помоги довести до рабочего кода пожалуйста:please:
 

mobidik

-----
for(int i = 0;i<5;i++)
{ double numbers[5]=GetExtremumZZPrice(i);}
ArraySort(numbers);
Alert(numbers[ArraySize(numbers)-1]); //max number
Alert(numbers[MathMax(ArraySize(numbers)-2,0)]);//pre last number

Не работает, не врубаю я, помоги довести до рабочего кода пожалуйста:please:

Все там прекрасно работает, если решил заполнить массив в цикле, ищи ошибку в этой строке:
PHP:
double numbers[5]=GetExtremumZZPrice(i)
 

eevviill2

Местный знаток
for(int i = 0;i<5;i++)
{ double numbers[5]=GetExtremumZZPrice(i);}
ArraySort(numbers);
Alert(numbers[ArraySize(numbers)-1]); //max number
Alert(numbers[MathMax(ArraySize(numbers)-2,0)]);//pre last number

Не работает, не врубаю я, помоги довести до рабочего кода пожалуйста:please:
А цыкл вообще зачем???
 

ivansss

Новичок форума
А цыкл вообще зачем???
Когда я искал ,с функции GetExtremumZZPrice(i) максимальное значение, с цикла записывая в ячеку а потом через условия сравнивал с новым результатом все работало , функция мне возвращает экстремумы зигзага, ну и я хочу соответственно найти два максимальных экстремума или два минимальных
 
Последнее редактирование:

Rennela

Новичок форума
GetLastError() время от времени выдает ошибку 4051-Недопустимое значение параметра функции-можно ли как-то прописать,чтобы указывало место в коде где ошибка?(код длинный искать ошибку трудно).Или только посредственно искать по блокам? Или это ошибка по устаревшим данным?
 

eevviill2

Местный знаток
А цыкл вообще зачем???
Когда я искал ,с функции GetExtremumZZPrice(i) максимальное значение, с цикла записывая в ячеку а потом через условия сравнивал с новым результатом все работало , функция мне возвращает экстремумы зигзага, ну и я хочу соответственно найти два максимальных экстремума или два минимальных
PHP:
double numbers[5];
for(int i = 0;i<5;i++)
{
numbers[i]=GetExtremumZZPrice(i);
}
ArraySort(numbers);
Alert(numbers[ArraySize(numbers)-1]); //max number
Alert(numbers[MathMax(ArraySize(numbers)-2,0)]);//pre last number
 

Ugar

Гуру форума
GetLastError() время от времени выдает ошибку 4051-Недопустимое значение параметра функции-можно ли как-то прописать,чтобы указывало место в коде где ошибка?(код длинный искать ошибку трудно).Или только посредственно искать по блокам? Или это ошибка по устаревшим данным?
Прописать можно, но это рутинно. Вообще прописывать это надо всегда.
Например:
ResetLastError();
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
Print("Ордер не выбран, ошибка = ",GetLastError());
}
Сбросил ошибку, выполнил функцию, распечатал ошибку если она возникла. И так по всему коду, где могут возникать ошибки.
 

eevviill2

Местный знаток
GetLastError() время от времени выдает ошибку 4051-Недопустимое значение параметра функции-можно ли как-то прописать,чтобы указывало место в коде где ошибка?(код длинный искать ошибку трудно).Или только посредственно искать по блокам? Или это ошибка по устаревшим данным?
Нет.
Только если это помешало открыть ордер или модифицировать или закрыть то в журнале терминала пишет номер строки.
 
Верх