Закрывать все сделки через 30м после открытия - страница 4

 
Evgeniy Zhdan:

Зачем так радикально? Касаемо данного случая - горОдите огород. Ну что, трудно написать Bid или Ask вместо OrderClosePrice(), работоспособность которого не гарантирована? К тому же, Ask - Bid имеет меньше букв.

Это и есть стандарты при правильном применении:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Применение функция OrderClosePrice() к открытым ордерам

Renat Fatkhullin, 2006.09.11 18:14

В общем случае нельзя. OrderClosePrice содержит закешированное значение на момент вызова OrderSelect и это значение может устареть к моменту вызова OrderClose.

А в частном случае, когда идет такая вот последовательность:
if(OrderSelect(...))
  {
    ... // что-то очень быстрое и незатратное
   if(OrderClose(..., OrderClosePrice()) ....
 
  }
то можно использовать. Но если будут появляться сообщения об частых реквотах или ошибках, то стоит серьезно подумать над более корректной реализацией.

Обновлять информацию о рыночном окружении Ask/Bid/т.д. куда более затратно, чем использовать уже имеющую при проходе цикла.

Хотите писать что-то медленное и затратное - пишите.

 
Vitaly Muzichenko:

Это и есть стандарты при правильном применении:


Обновлять информацию о рыночном окружении Ask/Bid/т.д. куда более затратно, чем использовать уже имеющую при проходе цикла.

Хотите писать что-то медленное и затратное - пишите.

Он там выбрал тип ордера:

         if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber()==MagicNumber)
           {
            ticket=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5,Black);
           }

Зачем тогда писать вместо цены закрытия Bid функцию 

OrderClosePrice()

Если так:

  if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
           {
            ticket=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5,Black);
           }

То может и имеет смысл, чтобы обработать и бай и селл и не писать для селл отдельно.

Vitaly Muzichenko:

Хотите писать что-то медленное и затратное - пишите.

А это вообще смешно. На сколько сократите затраты и сократите ли вообще в случае частых неудач закрытия? Можете не отвечать.

 
Evgeniy Zhdan:

Зачем так радикально? Касаемо данного случая - горОдите огород. Ну что, трудно написать Bid или Ask вместо OrderClosePrice(), работоспособность которого не гарантирована? К тому же, Ask - Bid имеет меньше букв.

Я где-то уже говорил, «Программист должен сохранять гибкость ума» а не тупо следовать вдоль забора который кто-то нарисовал. Дело не в количестве буковок. И предопределёнными Ask и Bid я так давно не пользуюсь, что забыл об их существовании.

 
Alexey Viktorov:

Я где-то уже говорил, «Программист должен сохранять гибкость ума» а не тупо следовать вдоль забора который кто-то нарисовал. Дело не в количестве буковок. И предопределёнными Ask и Bid я так давно не пользуюсь, что забыл об их существовании.

гибкость ума программиста это способность оного найти оптимальный (возможно и оригинальный) алгоритм

то, о чем Вы спорите, это...это..,  ну вот гугл подсказывает " ректальная тонзиллэктомия ", а не гибкость - использование недокументированных особенностей ОС или в нашем случаем MQL - это путь к бесконечному поиску багов, а не к написанию робастого алгоритма

упомянутый админ, неоднократно пишет в своих сообщениях: "пишите коды ПРАВИЛЬНО" и читайте документацию

 
Igor Makanu:

гибкость ума программиста это способность оного найти оптимальный (возможно и оригинальный) алгоритм

то, о чем Вы спорите, это...это..,  ну вот гугл подсказывает " ректальная тонзиллэктомия ", а не гибкость - использование недокументированных особенностей ОС или в нашем случаем MQL - это путь к бесконечному поиску багов, а не к написанию робастого алгоритма

упомянутый админ, неоднократно пишет в своих сообщениях: "пишите коды ПРАВИЛЬНО" и читайте документацию

Игорь, я не призываю так писать. Я только говорю о том, что это работает. И больше ни че-го¡¡¡

А гибкость ума это понимание что есть несколько вариантов решения одной задачи и способность выбрать «оптимальный (возможно и оригинальный) алгоритм»

 
Alexey Viktorov:

Игорь, я не призываю так писать. Я только говорю о том, что это работает. И больше ни че-го¡¡¡

тогда так и пишите - это точно работает на сервере ххх и в билде ууу 

ладно, время нет, нравится пишите, я в 99% случаев использую коды из справки или статей - это, как минимум, экономит время

 
Alexey Viktorov:

Проверял?

Читайте внимательно сообщения разработчиков.

Или тут https://www.mql5.com/ru/forum/53002

Бывает, со временем закрытия спутал)) Но если честно цены впрямую правильнее, чем откуда то закешированное значение доставать) Странно цена закрытия зачем то кешируется и место определено с функцией, а комиссия, пока ордер не выставишь, нет.

 
Парни, не устаёте удивлять. Поясню: в момент начала формирования нового бара фиксируется цена закрытия предыдущего. Иначе говоря, в момент открытия бара O=H=L=C. Дальше цена закрытия совпадает то с Low, то с High, как сложится. Торговать по ней невозможно в принципе. Можно по цене открытия нового бара. Всё, у меня течёт потолок, ухожу. 
 
banalen:

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

Вот так закрывает - только я самоучка и не знаю, правильно ли так, - но работает!

-------------------------------------------

Жёлтым - что добавил в Ваш Эксперт. 

//+------------------------------------------------------------------+
//|                                                      banalen.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int    MinutesBUY=30;
input int    MinutesSELL=30;
input bool   OpenBUY=True;
input bool   OpenSELL=True;
input bool   CloseBySignal=True;
input double StopLoss=0;
input double TakeProfit=0;
input double TrailingStop=0;
input int    RSIperiod=14;
input double BuyLevel=30;
input double SellLevel=70;
input bool   AutoLot=True;
input double Risk=10;
input double ManualLots=0.1;
input int    MagicNumber=123;
input string Koment="RSIea";
input int    Slippage=10;
//---
int OrderBuy,OrderSell;
int ticket;
int LotDigits;
double Trail,iTrailingStop;
datetime ExTimeBUY=0;
datetime ExTimeSELL=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double stoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
   OrderBuy=0;
   OrderSell=0;
   for(int cnt=0; cnt<OrdersTotal(); cnt++)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber && OrderComment()==Koment)
           {
            if(OrderType()==OP_BUY)
               OrderBuy++;
            if(OrderType()==OP_SELL)
               OrderSell++;
            if(OrderType()==OP_BUY)
               MinuteBuy();
            if(OrderType()==OP_SELL)
               MinuteSell();
            if(TrailingStop>0)
              {
               iTrailingStop=TrailingStop;
               if(TrailingStop<stoplevel)
                  iTrailingStop=stoplevel;
               Trail=iTrailingStop*Point;
               double tsbuy=NormalizeDouble(Bid-Trail,Digits);
               double tssell=NormalizeDouble(Ask+Trail,Digits);
               if(OrderType()==OP_BUY && Bid-OrderOpenPrice()>Trail && Bid-OrderStopLoss()>Trail)
                 {
                  ticket=OrderModify(OrderTicket(),OrderOpenPrice(),tsbuy,OrderTakeProfit(),0,Blue);
                 }
               if(OrderType()==OP_SELL && OrderOpenPrice()-Ask>Trail && (OrderStopLoss()-Ask>Trail || OrderStopLoss()==0))
                 {
                  ticket=OrderModify(OrderTicket(),OrderOpenPrice(),tssell,OrderTakeProfit(),0,Blue);
                 }
              }
           }
     }
   double rsi=iRSI(Symbol(),0,RSIperiod,PRICE_CLOSE,0);
   double rsi1=iRSI(Symbol(),0,RSIperiod,PRICE_CLOSE,1);
// double HTb=iCustom(Symbol(),0,"HalfTrend-1.02",0,0); //buy
// double HTs=iCustom(Symbol(),0,"HalfTrend-1.02",1,0); //buy
//--- open position
   if(OpenSELL && OrderSell<1 && rsi<SellLevel && rsi1>SellLevel)
      OPSELL();
   if(OpenBUY && OrderBuy<1 && rsi>BuyLevel && rsi1<BuyLevel)
      OPBUY();
//--- close position by signal
   if(CloseBySignal)
     {
      if(OrderBuy>0 && rsi<SellLevel && rsi1>SellLevel)
         CloseBuy();
      if(OrderSell>0 && rsi>BuyLevel && rsi1<BuyLevel)
         CloseSell();
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OPBUY()
  {
   double StopLossLevel;
   double TakeProfitLevel;
   if(StopLoss>0)
      StopLossLevel=Bid-StopLoss*Point;
   else
      StopLossLevel=0.0;
   if(TakeProfit>0)
      TakeProfitLevel=Ask+TakeProfit*Point;
   else
      TakeProfitLevel=0.0;
   ticket=OrderSend(Symbol(),OP_BUY,LOT(),Ask,Slippage,StopLossLevel,TakeProfitLevel,Koment,MagicNumber,0,DodgerBlue);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OPSELL()
  {
   double StopLossLevel;
   double TakeProfitLevel;
   if(StopLoss>0)
      StopLossLevel=Ask+StopLoss*Point;
   else
      StopLossLevel=0.0;
   if(TakeProfit>0)
      TakeProfitLevel=Bid-TakeProfit*Point;
   else
      TakeProfitLevel=0.0;
//---
   ticket=OrderSend(Symbol(),OP_SELL,LOT(),Bid,Slippage,StopLossLevel,TakeProfitLevel,Koment,MagicNumber,0,DeepPink);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseSell()
  {
   int  total=OrdersTotal();
   for(int y=OrdersTotal()-1; y>=0; y--)
     {
      if(OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber)
           {
            ticket=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5,Black);
           }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseBuy()
  {
   int  total=OrdersTotal();
   for(int y=OrdersTotal()-1; y>=0; y--)
     {
      if(OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber()==MagicNumber)
           {
            ticket=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5,Black);
           }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LOT()
  {
   double lotsi;
   double ilot_max =MarketInfo(Symbol(),MODE_MAXLOT);
   double ilot_min =MarketInfo(Symbol(),MODE_MINLOT);
   double tick=MarketInfo(Symbol(),MODE_TICKVALUE);
//---
   double  myAccount=AccountBalance();
//---
   if(ilot_min==0.01)
      LotDigits=2;
   if(ilot_min==0.1)
      LotDigits=1;
   if(ilot_min==1)
      LotDigits=0;
//---
   if(AutoLot)
     {
      lotsi=NormalizeDouble((myAccount*Risk)/10000,LotDigits);
     }
   else
     {
      lotsi=ManualLots;
     }
//---
   if(lotsi>=ilot_max)
     {
      lotsi=ilot_max;
     }
//---
   return(lotsi);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void MinuteBuy()
  {
//---
   datetime times=TimeLocal();
   if(ExTimeBUY==0 || times>ExTimeBUY+60)
     {
      ExTimeBUY=times+60*MinutesBUY;
     }
   if(times>=ExTimeBUY && times<ExTimeBUY+60)
     {
      ExTimeBUY=times+60*MinutesBUY;
      CloseBuy();
      PlaySound("ok.wav");
      printf("CloseBuy() parameters : ");
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void MinuteSell()
  {
//---
   datetime times=TimeLocal();
   if(ExTimeSELL==0 || times>ExTimeSELL+60)
     {
      ExTimeSELL=times+60*MinutesSELL;
     }
   if(times>=ExTimeSELL && times<ExTimeSELL+60)
     {
      ExTimeSELL=times+60*MinutesSELL;
      CloseSell();
      PlaySound("ok.wav");
      printf("CloseSell() parameters : ");
     }
  }
//+------------------------------------------------------------------+
Файлы:
banalen.PNG  121 kb