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

KriKs-Fx

Интересующийся
Т.Е. if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) заменить на bool x=OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) ???
 

Flank

Новичок форума
Ребята, подскажите пожалуйста, как закрыть ордера с убытком, у меня не получается, вызываю вот эту функцию, ошибок не выдает, закрывает только профитные
Код:
void CloseAllOpendOrders()
{bool bw,bc;
   for(int t=0;t<=OrdersTotal();t++)
      {bw=OrderSelect(t,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()== Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY){
            bc=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Yellow);
               if(bc == false) 
                  Print("#",OrderTicket(),"  Error: ",GetLastError()," Функция: OrderClose(",OrderTicket(),",",OrderLots(),",",Bid,",",Slippage,")");
         }                  
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType()== OP_SELL){
            bc=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Yellow);
               if(bc == false)
                  Print("#",OrderTicket(),"  Error: ",GetLastError()," Функция: OrderClose(",OrderTicket(),",",OrderLots(),",",Ask,",",Slippage,")");
         }               
      }
}
И правильно ли я там написал обработку ошибок, если нет, поправьте пожалуйста. И еще один вопрос, покажите ссылку где описанно как работать с мышкой и делать кнопки в советнике.
 

vladradon

Программист
Привет! Могу предложить рабочие версии в моей разработке по ссылке ниже. Там же и можно по кнопкам ориентировочно "набить руку". Обработка ошибок - последнее, что нужно учитывать - важно их не допускать в коде.
Простейшая функция закрытия всех ордеров :
PHP:
void CloseAll()
  {
   int xx;
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)
            xx=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10,clrRed);

  }
Только запускать ее нужно с предварительной проверкой - т.е. при каком-то событии, когда можно или нужно закрыть все ордера.
https://forexsystemsru.com/poleznye-utility/86121-mnogourovnevyi-virtual`nyi-treiling-4.html
 
Последнее редактирование:

Flank

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

Flank

Новичок форума
А почему у вас ХХ int? OrderClose возвращет же bool или я ошибаюсь?
 

vladradon

Программист
Спасибо, завтра попробую. Перед удалением естественно происходит проверка услови для закрытия всех ордеров, потом происходит вызов функции.
По поводу проверки на правильность работы кода - уже не первый раз рассказываю: в 2012 году на чемпионате АТС2012 сов из около 3500 получили допуск меньше 500 (из 117 стран) и отсеяны были ве совы из-за малейшей огрехи - даже если терминал выдавал предупреждение о том, что не хватает средств для открытия очередного ордера. Правильно работают те проги, которые не допускают ошибок, а не те, которые анализируют допущенные ошибки.
 

Flank

Новичок форума
По поводу проверки на правильность работы кода - уже не первый раз рассказываю: в 2012 году на чемпионате АТС2012 сов из около 3500 получили допуск меньше 500 (из 117 стран) и отсеяны были ве совы из-за малейшей огрехи - даже если терминал выдавал предупреждение о том, что не хватает средств для открытия очередного ордера. Правильно работают те проги, которые не допускают ошибок, а не те, которые анализируют допущенные ошибки.

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

vladradon

Программист
Я с вами согласен, но это же не готовый робот, я пишу его и отлаживаю, процесс отладки без анализа ошибок я не представляю. Более того я только учусь.
Это понятно. Если смогу чем-то помочь - постараюсь. А по поводу анализа ошибок - терминал Вам выдаст те ошибки и сообщения о них, над которыми нужно работать, а в коде сова пытаться искать ошибки, которых, возможно, нет, - это тупо тратить свое и процессорное время.
 

KriKs-Fx

Интересующийся
Увеличение лота после StopLoss + Количество раз.

Господа программисты! Подскажите как написать код для увеличения Лота после закрытия предшествующего ордера по StopLoss и вывести опцию в настройки количество раз увеличения Лота?
 

vladradon

Программист
Господа программисты! Подскажите как написать код для увеличения Лота после закрытия предшествующего ордера по StopLoss и вывести опцию в настройки количество раз увеличения Лота?
Можешь так попробовать, если в рынке только один ордер постоянно на данном инструменте:
PHP:
extern double Lot=0.01; // Базовый лот
extern double MultLot1=2; // Коэффициент умножения лота (1 - отключен)
extern double MultLot2=0.01; // Коэффициент прибавления лота (0 - отключен)
extern int    Counts=5; // Количество увеличений лота
extern int    Magic=123;
//--------
double CountLots()
 {
  double lot=Lot;
  double maxlot=Lot;
  for(int c=1; c<=Counts; c++) maxlot=NormalizeDouble(maxlot*MultLot1+MultLot2,2);
  for(int i=OrdersHistoryTotal()-1; i<=0; i--)
    if(OrderSelect(i,SELECT_BY_POS, MODE_HISTORY))
      if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
        if(StringFind(OrderComment(),"sl") >=0)
          if((lot=NormalizeDouble(OrderLots()*MultLot1+MultLot2,2))<=maxlot) return(lot);
  return(Lot);
 }
Только функцию нужно запускать с условием, что в рынке нет ордера на данный момент на данном инструменте с данным магиком.
Есть один момент: стоплосс может закрыть ордер в плюс, если это обычный трал и тогда стоит заменить строку
PHP:
if(StringFind(OrderComment(),"sl") >=0)
на
PHP:
if(OrderProfit()<0.0)
 
Последнее редактирование:

KriKs-Fx

Интересующийся
Благодарю Вас уважаемый !!! (Все ошибаются :)) Подскажите пожалйуста как правильно вставить код в советник?

//--------------------------------------------------------------------*/
extern int KPeriod = 6;
extern int DPeriod = 3;
extern int Slowing = 5;
extern int LevelSell = 75;
extern int LevelBuy = 25;
extern int Stoploss = 10; //стоплосс
extern int Takeprofit = 15; //тейкпрофит
extern int TrailingStop = 0; //трейлингстоп, если 0, то нет трейлинга
extern double Lot = 0.10; //лот
extern int slippage = 1; // проскальзывание
extern int Magic = 2222;
//--------------------------------------------------------------------
double STOPLEVEL;

//-------------------------------------------------------------------
void OnTick()
{
if (!IsTradeAllowed())
{
return;
}
STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
double OSL,OTP,OOP,StLo=0,SL=0,TP=0;
int i,b=0,s=0,tip;
for (i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
{
tip = OrderType();
OSL = NormalizeDouble(OrderStopLoss(),Digits);
OTP = NormalizeDouble(OrderTakeProfit(),Digits);
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
SL=OSL;TP=OTP;
if (tip==OP_BUY)
{
b++;
if (OSL==0 && Stoploss>=STOPLEVEL && Stoploss!=0)
{
SL = NormalizeDouble(OOP - Stoploss * Point,Digits);
}
if (OTP==0 && Takeprofit>=STOPLEVEL && Takeprofit!=0)
{
TP = NormalizeDouble(OOP + Takeprofit * Point,Digits);
}
if (TrailingStop>=STOPLEVEL && TrailingStop!=0)
{
StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits);
if (StLo >= OOP && StLo > OSL) SL = StLo;
}
if (SL != OSL || TP != OTP)
{
if (!OrderModify(OrderTicket(),OOP,SL,TP,0,clrNONE)) Print("Error OrderModify <<",(GetLastError()),">> ");
}
}
if (tip==OP_SELL)
{
s++;
if (OSL==0 && Stoploss>=STOPLEVEL && Stoploss!=0)
{
SL = NormalizeDouble(OOP + Stoploss * Point,Digits);
}
if (OTP==0 && Takeprofit>=STOPLEVEL && Takeprofit!=0)
{
TP = NormalizeDouble(OOP - Takeprofit * Point,Digits);
}
if (TrailingStop>=STOPLEVEL && TrailingStop!=0)
{
StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits);
if (StLo <= OOP && (StLo < OSL || OSL==0)) SL = StLo;
}
if (SL != OSL || TP != OTP)
{
if (!OrderModify(OrderTicket(),OOP,SL,TP,0,clrNONE)) Print("Error OrderModify <<",(GetLastError()),">> ");
}
}
}
}
}
//----------------------------------------------------------------

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;
}
//--------------------------------------------------------------------

Грызу "гранит" MQL :facepalm:
 

vladradon

Программист
Подскажите пожалйуста как правильно вставить код в советник?
Немного доработал функцию и воткнул в ваш код. Там желательно сделать так, чтобы при стопуровне больше стоплосса или тейкпрофита, они автоматом увеличивались до стопуровня+1. А то если меньше, то стопы и тейки не выставляются вообще.
 

Вложения

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

KriKs-Fx

Интересующийся
Спасибо Вам большое!!! Но есть один момент! как исправить код что бы Советник не реагировал на "шум" т.е. После открытия ордера как пример на BUY во время тренда ордера на Sell не открывались? и наоборот.
 

LexeR

Активный участник
Спасибо Вам большое!!! Но есть один момент! как исправить код что бы Советник не реагировал на "шум" т.е. После открытия ордера как пример на BUY во время тренда ордера на Sell не открывались? и наоборот.

Вы как тренд фильтровать собираетесь? С помощью машек?
 

KriKs-Fx

Интересующийся
MA Совсем тут не причём. Есть другие индикаторы а Stochastik только как посредник один из факторов стратегии.
 
Верх