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

Ugar

Гуру форума
Именно так, нужно найти результат последнего закрытого ордера. Как нужно это реализовать?
Сейчас закрывается серия функцией, при положительном результате серии сначала убыточные, затем прибыльные. Для отрицательного результата серии аналогичная функция наоборот.
Примерно так?(прошу проверить):
double lot=Lots;
datetime t = 0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderCloseTime() > t)
{
if(OrderProfit()<0) lot=OrderLots()*KLot;
t = OrderCloseTime();
break;
}
}
}
}
Почти. break надо убрать. Добавить вариант лота при обнаружении ордера с прибылью больше 0.
 

STARGAZER

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

ivansss

Новичок форума
Уважаемые форумчане, что нужно дописать/изменить чтобы созданная линия на графике перерисовывалась?


datetime T2=Time[0];
Comment(T2);
ObjectCreate(0,"obj_name",OBJ_HLINE,0,0,_lastExtremum_7);
ObjectSetInteger(0,"obj_name",OBJPROP_COLOR,clrLime);
ObjectSet( "obj_name", OBJPROP_WIDTH, 3);// Стил
ObjectMove(0,"obj_name",T2,_lastExtremum_7);
ChartRedraw();

Спасибо..
 

seronn

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

В нужное место в советнике вставить
double k=5;
if (AccountEquity()>=AccountBalance()*NormalizeDouble((1+k/100),2)) { вызываем функцию закрытия ордеров }
k в процентах от баланса.
 

Ugar

Гуру форума
Подскажите как прописать в коде проверку баланса далее узнать средства и если средства отличаются от депозита на заданный процент закрыть все ордера
Если заданный % просадки в переменной Percent
double OnePercentBalance=AccountBalance()/100;//1% от баланса
double Drawdown=AccountBalance()-AccountEquity();//Просадка в валюте
double DrawdownPercent= Drawdown/OnePercentBalance;//Просадка в % от баланса
if(DrawdownPercent>Percent)//Если просадка достигла заданной
{
//Здесь закрытие всех ордеров
}
Можно конечно это написать в 1 строчку, но так понятнее
 

STARGAZER

Новичок форума
Если заданный % просадки в переменной Percent
double OnePercentBalance=AccountBalance()/100;//1% от баланса
double Drawdown=AccountBalance()-AccountEquity();//Просадка в валюте
double DrawdownPercent= Drawdown/OnePercentBalance;//Просадка в % от баланса
if(DrawdownPercent>Percent)//Если просадка достигла заданной
{
//Здесь закрытие всех ордеров
}
Можно конечно это написать в 1 строчку, но так понятнее

Благодарю Вас.

Подскажите я прописал закрытие всех ордеров вот так, на сколько это правильно?

// ПРОПИШЕМ ПРОВЕРКУ СРЕДСТВ
double OnePercentBalance=AccountBalance()/100;//1% от баланса
double Drawdown=AccountBalance()-AccountEquity();//Просадка в валюте
double DrawdownPercent= Drawdown/OnePercentBalance;//Просадка в % от баланса

if(DrawdownPercent>DepoProcent)//Если просадка достигла заданной

{
for(int p=total-1; p>=0; p--)
{
if(OrderSelect(p, SELECT_BY_POS))

{
OrderClose(OrderTicket(), OrderLots(), Bid, 3, Red);
OrderClose(OrderTicket(), OrderLots(), Ask, 3, Red);
}
}
}
 

Ugar

Гуру форума
Благодарю Вас.

Подскажите я прописал закрытие всех ордеров вот так, на сколько это правильно?

// ПРОПИШЕМ ПРОВЕРКУ СРЕДСТВ
double OnePercentBalance=AccountBalance()/100;//1% от баланса
double Drawdown=AccountBalance()-AccountEquity();//Просадка в валюте
double DrawdownPercent= Drawdown/OnePercentBalance;//Просадка в % от баланса

if(DrawdownPercent>DepoProcent)//Если просадка достигла заданной

{
for(int p=total-1; p>=0; p--)
{
if(OrderSelect(p, SELECT_BY_POS))

{
OrderClose(OrderTicket(), OrderLots(), Bid, 3, Red);
OrderClose(OrderTicket(), OrderLots(), Ask, 3, Red);
}
}
}
Если упрощено, так пойдёт.
// ПРОПИШЕМ ПРОВЕРКУ СРЕДСТВ
double OnePercentBalance=AccountBalance()/100;//1% от баланса
double Drawdown=AccountBalance()-AccountEquity();//Просадка в валюте
double DrawdownPercent= Drawdown/OnePercentBalance;//Просадка в % от баланса

if(DrawdownPercent>DepoProcent)//Если просадка достигла заданной

{
int total=OrdersToral();//Количество ордеров
for(int p=total-1; p>=0; p--)
{
if(OrderSelect(p, SELECT_BY_POS))

{
if(OrderType()==OP_BUY)OrderClose(OrderTicket(), OrderLots(), Bid, 3, Red);
if(OrderType()==OP_SELL)OrderClose(OrderTicket(), OrderLots(), Ask, 3, Red);
}
}
}
 
Последнее редактирование:

Ugar

Гуру форума
Уважаемые форумчане, что нужно дописать/изменить чтобы созданная линия на графике перерисовывалась?


datetime T2=Time[0];
Comment(T2);
ObjectCreate(0,"obj_name",OBJ_HLINE,0,0,_lastExtremum_7);
ObjectSetInteger(0,"obj_name",OBJPROP_COLOR,clrLime);
ObjectSet( "obj_name", OBJPROP_WIDTH, 3);// Стил
ObjectMove(0,"obj_name",T2,_lastExtremum_7);
ChartRedraw();

Спасибо..
Самостоятельно линия перерисовываться не будет. Перерисовывай её сколько угодно с помощью ObjectMove
 

seronn

Новичок форума
Добрый день! Подскажите пожалуйста, есть такой индикатор(вложение). Никак не могу его прицепить в советник. Вызываю так:
higher=iCustom(Symbol(),PERIOD_CURRENT,"ATRChannel",10,2,2.0,true,true,1,30,1,1000,1000,4,1);
содержимое буфера по идее должно быть равно цене на линии канала, а тут выдает EMPTY_VALUE.
Что не так? Сможете помочь?
 

Вложения

  • ATRChannel.mq4
    5,6 КБ · Просмотры: 21
Последнее редактирование:

mobidik

-----
Добрый день! Подскажите пожалуйста, есть такой индикатор(вложение). Никак не могу его прицепить в советник. Вызываю так:
higher=iCustom(Symbol(),PERIOD_CURRENT,"ATRChannel",10,2,2.0,true,true,1,30,1,1000,1000,4,1);
содержимое буфера по идее должно быть равно цене на линии канала, а тут выдает EMPTY_VALUE.
Что не так? Сможете помочь?

Все правильно он выдает:
4 и 5 - это стрелки,
0 и 1 - центральная линия,
2 и 3 - линии канала.
Вы берете сигнал со стрелки.
 

seronn

Новичок форума
Все правильно он выдает:
4 и 5 - это стрелки,
0 и 1 - центральная линия,
2 и 3 - линии канала.
Вы берете сигнал со стрелки.

К сожалению, не получается... Попробовал в конец бота вставить
double a,b,c,d,e,f;
a=iCustom(Symbol(),PERIOD_CURRENT,"ATRChannel",10,2,2.0,true,true,1,30,1,1000,1000,0,1);
b=iCustom(Symbol(),PERIOD_CURRENT,"ATRChannel",10,2,2.0,true,true,1,30,1,1000,1000,1,1);
c=iCustom(Symbol(),PERIOD_CURRENT,"ATRChannel",10,2,2.0,true,true,1,30,1,1000,1000,2,0);
d=iCustom(Symbol(),PERIOD_CURRENT,"ATRChannel",10,2,2.0,true,true,1,30,1,1000,1000,3,0);
e=iCustom(Symbol(),PERIOD_CURRENT,"ATRChannel",10,2,2.0,true,true,1,30,1,1000,1000,4,1);
f=iCustom(Symbol(),PERIOD_CURRENT,"ATRChannel",10,2,2.0,true,true,1,30,1,1000,1000,5,1);

Comment(" "
+ "\n A: ", DoubleToString(a,Digits)
+ "\n B: ", DoubleToString(b,Digits)
+ "\n C: ", DoubleToString(c,Digits)
+ "\n D: ", DoubleToString(d,Digits)
+ "\n E: ", DoubleToString(e,Digits)
+ "\n F: ", DoubleToString(f,Digits) );"
Результат EMPTY_VALUE кроме 0 и 1
 

mobidik

-----
К сожалению, не получается... Попробовал в конец бота вставить
double a,b,c,d,e,f;
a=iCustom(Symbol(),PERIOD_CURRENT,"ATRChannel",10,2,2.0,true,true,1,30,1,1000,1000,0,1);
b=iCustom(Symbol(),PERIOD_CURRENT,"ATRChannel",10,2,2.0,true,true,1,30,1,1000,1000,1,1);
c=iCustom(Symbol(),PERIOD_CURRENT,"ATRChannel",10,2,2.0,true,true,1,30,1,1000,1000,2,0);
d=iCustom(Symbol(),PERIOD_CURRENT,"ATRChannel",10,2,2.0,true,true,1,30,1,1000,1000,3,0);
e=iCustom(Symbol(),PERIOD_CURRENT,"ATRChannel",10,2,2.0,true,true,1,30,1,1000,1000,4,1);
f=iCustom(Symbol(),PERIOD_CURRENT,"ATRChannel",10,2,2.0,true,true,1,30,1,1000,1000,5,1);

Comment(" "
+ "\n A: ", DoubleToString(a,Digits)
+ "\n B: ", DoubleToString(b,Digits)
+ "\n C: ", DoubleToString(c,Digits)
+ "\n D: ", DoubleToString(d,Digits)
+ "\n E: ", DoubleToString(e,Digits)
+ "\n F: ", DoubleToString(f,Digits) );"
Результат EMPTY_VALUE кроме 0 и 1

Да все работает, смотрите, что пишет в экспертах, скорее всего, сам индюк находится не в самой папке Indicators, а в подпапке...
http://c2n.me/3EyFL5m
 

seronn

Новичок форума
Все понятно почему так было. Почему-то значения не читаются в тестере(( Если сов просто накинуть на график - всё работает. В тестере буферы чистые. Оптимизация такого сова оооочень затруднительна((
 

mobidik

-----
Все понятно почему так было. Почему-то значения не читаются в тестере(( Если сов просто накинуть на график - всё работает. В тестере буферы чистые. Оптимизация такого сова оооочень затруднительна((

Да все там тестится, у тебя не хватает истории при старте тестирования. Уверен на все 100, что в журнале тестера есть запись об ошибке, но ты её игнорируешь или не знаешь что с ней делать. Уменьши, для начало глубину истории индюка, при этом период АТR не должен быть больше самого значения истории, прокачай свой терминал котировками, если что - гугл в помощь.
 

Вложения

  • ATRRRR.png
    ATRRRR.png
    60,1 КБ · Просмотры: 30

Conn

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

Условие в целом такие:
Если открытых ордеров нет
выставляется отложенный ордер с лотом 0,1 с тейком и стопом.
При срабатывании одного отложенного ордера, другой отложенник должен удалится.
 

Вложения

  • новый.mq4
    1,8 КБ · Просмотры: 22
  • Безымянный.png
    Безымянный.png
    53,6 КБ · Просмотры: 26

vladradon

Программист
Всем привет, подскажите пожалуйста...
Как сделать в советнике так, чтобы при срабатывании одного отложенного ордера другой отложенный ордер удалился.
Можно так:
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()==ticket) {b=OrderDelete(ticket1); break;}
if (OrderType() == OP_SELL && OrderTicket()==ticket1) {b=OrderDelete(ticket); break;}
}
}
 
  • Like
Реакции: Conn

maximuson

Новичок форума
Нет возможности перекапать весь форум. м.б. эта тема и есть..
Помогите/напишите пож. Есть несколько ордеров в BUY, их может быть 3,9,12.... мне нужно выделить "первый" и "последний" ордер по времени открытия и так полагаю нужно использовать OrderOpenTime(); как указать в функции какой ордер первый открылся а какой последний?
 
Последнее редактирование:

mobidik

-----
Нет возможности перекапать весь форум. м.б. эта тема и есть..
Помогите/напишите пож. Есть несколько ордеров в BUY, их может быть 3,9,12.... мне нужно выделить "первый" и "последний" ордер по времени открытия и так полагаю нужно использовать OrderOpenTime(); как указать в функции какой ордер первый открылся а какой последний?

Думаю, что разберешься с кодом:
PHP:
int FindFirstOrder(int Type, int MN)
{
  int Ticket = 0, TotalOrders = OrdersTotal();
  datetime OpenTime = 0; 
  
  for(int i = 0; i < TotalOrders; i++)
    if(OrderSelect(i, SELECT_BY_POS))
      if(OrderSymbol() == Symbol()) 
        if(OrderType() == Type && OrderMagicNumber() == MN)
          if(OpenTime == 0 || OrderOpenTime() < OpenTime)
          {
            OpenTime = OrderOpenTime();
            Ticket = OrderTicket();
          }
  return(Ticket);          
}

int FindLastOrder(int Type, int MN)
{
  int Ticket = 0, TotalOrders = OrdersTotal();
  datetime OpenTime = 0; 
  
  for(int i = 0; i < TotalOrders; i++)
    if(OrderSelect(i, SELECT_BY_POS))
      if(OrderSymbol() == Symbol()) 
        if(OrderType() == Type && OrderMagicNumber() == MN)
          if(OrderOpenTime() > OpenTime)
          {
            OpenTime = OrderOpenTime();
            Ticket = OrderTicket();
          }
  return(Ticket);          
}
 

dialock

Прохожий
Помогите пожалуйста. Неделю сижу, не могу вставить функцию закрытия ордера при следующим пересечении после открытия. Не получается правильное условие написать.


double Stoch0 = iStochastic(NULL,0,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,0);
double Signl0 = iStochastic(NULL,0,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_SIGNAL,0);

double Stoch1 = iStochastic(NULL,0,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,1);
double Signl1 = iStochastic(NULL,0,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_SIGNAL,1);

//-----------------------------------------------------------------------
if(Stoch0>Signl0 && Stoch1<Signl1 && Stoch0<LevelBuy)
{
if(b==0)
{
if(OrderSend(Symbol(),OP_BUY,Lot,NormalizeDouble(Ask,Digits),slippage,0,0,NULL,Magic,0,clrNONE)==-1) Print("Ошибка открытия ордера <<",(GetLastError()),">> ");
}
}
if(Stoch0<Signl0 && Stoch1>Signl1 && Stoch0>LevelSell)
{
if(s==0)
{
if(OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,0,0,NULL,Magic,0,clrNONE)==-1) Print("Ошибка открытия ордера <<",(GetLastError()),">> ");
}
}
return;

//--------------------------------------------------------------------
if(Stoch0<Signl0)
{
if(s==0)
{
if(OrderClose(Magic,1,Bid,3,Green))GetLastError();
return;
}
}
if(Stoch1<Signl1)
{
if(b==0)
{
if(OrderClose(Magic,1,Ask,3,Green))GetLastError();
}
}
return;
}
//+------------------------------------------------------------------+
 

maximuson

Новичок форума
Первое значение в скопках в функции OrderClose() задается ticket а не Magic если я неошибаюсь.

_https://docs.mql4.com/ru/trading/orderclose
 
Последнее редактирование модератором:
Верх