Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Зарегистрируйся на MQL5.community и оставляй комментарии!
blade_runner
69
blade_runner 2016.08.27 20:20 

Когда открывается новая свеча, то открываю сделку

extern double Lots = 0.1;

void OnTick()
{
   
         if(newBar()){  
             int Buy_ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Low[1],0,NULL,0,0,clrNONE);
                 
         }   
      
      
         if(newBar()){
            int Sell_ticket = OrderSend(Symbol(),OP_SELL,0.1,Bid,3,High[1],0,NULL,0,0,clrNONE);
           
         }    
  
}



bool newBar()
{
 static datetime lastbar = 0;
  datetime curbar = Time[0];
   if(lastbar != curbar)
    {
     lastbar = curbar;
     return (true);
    }
   else return(false);
}

 Не могу понять, как закрыть ордер на закрытии этой новой свечи, пробовал делать так

 

extern double Lots = 0.1;

void OnTick()
{

      int BullCandleSize1 = (Close[1] - Open[1]) / Point;
      int BullCandleSize2 = (Close[2] - Open[2]) / Point;
      int bearCandleSize1 = (Open[1] - Close[1]) / Point;
      int bearCandleSize2 = (Open[2] - Close[2]) / Point;
   
      if(Условие на покупку...){
         if(newBar()){  
             int Buy_ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Low[1],0,NULL,0,0,clrNONE);
                 
         } 
         
         if(TimeCurrent() == Close[0])
            OrderClose(Buy_ticket,0.1,Bid,3,clrNONE);  
      }
      
      
      
      if(Условие на продажу...){
         if(newBar()){
            int Sell_ticket = OrderSend(Symbol(),OP_SELL,0.1,Bid,3,High[1],0,NULL,0,0,clrNONE);
           
         }
         
         if(TimeCurrent() == Close[0])
            OrderClose(Sell_ticket,0.1,Ask,3,clrNONE);    
      }
   
  
}



bool newBar()
{
 static datetime lastbar = 0;
  datetime curbar = Time[0];
   if(lastbar != curbar)
    {
     lastbar = curbar;
     return (true);
    }
   else return(false);
}

 Но ордер не закрывается,либо открывается, а потом сразу закрывается. Подскажите, как это правильно сделать, спасибо

Alexey Viktorov
5195
Alexey Viktorov 2016.08.28 06:03  

Надо всё засунуть в одно условие

if(newBar())
{
 if(Условие на покупку...)

 if(Условие на продажу...)
}

и к условию на покупку\продажу добавить проверку наличия уже открытых ордеров.

Потом, как я понял надо открыть Buy и закрыть Sell, но по коду открывается Buy и закрывается тоже Buy.

Закрыть "на закрытии" свечи можно только посчитав время прошедшее от открытия свечи, но тики приходят не регулярно и очень велика вероятность того, что время закрытия будет пропущено. Пока, как я понимаю, работать с OnTimer() для тебя сложно, поэтому лучше закрывать на открытии следующей свечи.

Boeing747
241
Boeing747 2016.08.28 11:37  

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

 

blade_runner
69
blade_runner 2016.08.28 14:42  
AlexeyVik:

Надо всё засунуть в одно условие

и к условию на покупку\продажу добавить проверку наличия уже открытых ордеров.

Потом, как я понял надо открыть Buy и закрыть Sell, но по коду открывается Buy и закрывается тоже Buy.

Закрыть "на закрытии" свечи можно только посчитав время прошедшее от открытия свечи, но тики приходят не регулярно и очень велика вероятность того, что время закрытия будет пропущено. Пока, как я понимаю, работать с OnTimer() для тебя сложно, поэтому лучше закрывать на открытии следующей свечи.



Спасибо,попробую написать
blade_runner
69
blade_runner 2016.08.28 14:44  
Boeing747:

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

 

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

Boeing747
241
Boeing747 2016.08.28 16:20  
//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#include <stdlib.mqh> 
extern double Lots=0.1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(newBar())
     {
      string symbol=_Symbol;
      int i,cmd,n,ticketsell[],ticketbuy[];
      ArrayResize(ticketsell,11,11);
      ArrayResize(ticketbuy,11,11);
      int sell=0;
      int buy=0;
      bool result;
      for(i=OrdersTotal()-1; i>=0; i--)
        {
         if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
         if(OrderSymbol()!=symbol) continue;
         cmd=OrderType();
         if(cmd>OP_SELL) continue;
         if(cmd==OP_SELL)
           {
            ticketsell[sell]=OrderTicket();
            sell++;
           }
         else
           {
            ticketbuy[buy]=OrderTicket();
            buy++;
           }
        }
      //---closebuy
      i=0;
      n=0;
      while(i<buy)
        {
         result=OrderClose(ticketbuy[i],0.1,Bid,3,clrNONE);
         if(!result)
           {
            n++;
            if(n>=3) break; // количество попыток закрыть buy
            if(Fun_Error(GetLastError())==1)
               continue;
            else
               break;
           }
         else
            i++;
        }
      //---closesell
      i=0;
      n=0;
      while(i<sell)
        {
         result=OrderClose(ticketsell[i],0.1,Ask,3,clrNONE);
         if(!result)
           {
            n++;
            if(n>=3) break; // количество попыток закрыть sell
            if(Fun_Error(GetLastError())==1)
               continue;
            else
               break;
           }
         else
            i++;
        }

      //---buy
      if(buy==0)
        {
         int Buy_ticket=OrderSend(symbol,OP_BUY,0.1,Ask,3,Low[1],0,NULL,0,0,clrNONE);

        }
      //---sell
      if(sell==0)
        {
         int Sell_ticket=OrderSend(symbol,OP_SELL,0.1,Bid,3,High[1],0,NULL,0,0,clrNONE);

        }
     }
  }
//+------------------------------------------------------------------+
bool newBar()
  {
   static datetime lastbar=0;
   datetime curbar=Time[0];
   if(lastbar!=curbar)
     {
      lastbar=curbar;
      return (true);
     }
   else return(false);
  }
//------------------------------------------------ Error-handling function
int Fun_Error(int Error)
  {
   Comment(" Error: "+ErrorDescription(Error)+"");
   switch(Error)
     {
      //--- Overcomable errors.
      case   4: Sleep(5000);    return(1);                 // Trade server is busy. Retry.
      case 135: RefreshRates(); return(1);                 // Price changed. Retry.
      case 136: Comment("OFF QUOTES. WAITING FOR NEW TICK.");
      while(RefreshRates()==false && IsStopped()==false)
         Sleep(100);
      return(1);
      case 137: Sleep(5000);    return(1);                 // Broker is busy.
      case 138: Sleep(200);     RefreshRates(); return(1); // Requote. Retry.
      case   6: Comment("NO CONNECTION WITH TRADE SERVER. WAITING FOR CONNECTION.");
      while(IsConnected()==false && IsStopped()==false)
         Sleep(500);
      return(1);
      case 146: Sleep(5000);    return(1);                 // Trade context is busy. Retry.
      case   8: Sleep(10000);   return(1);                 // Too frequent requests. Retry.
      case 128: Sleep(5000);    return(1);                 // Trade timeout. Retry.
      //---- Critical errors.
      default:  return(0);
     }
  }
//+------------------------------------------------------------------+
для открытия ордеров нужно добавить функцию обработки ошибок также как это сделано для закрытия ордеров чтобы в случае ошибки не пропустить сигнал.  в противном случае придется ждать следующего открытия бара
blade_runner
69
blade_runner 2016.08.28 16:54  
Boeing747:
для открытия ордеров нужно добавить функцию обработки ошибок также как это сделано для закрытия ордеров чтобы в случае ошибки не пропустить сигнал.  в противном случае придется ждать следующего открытия бара
огромное вам спасибо,буду разбираться)
blade_runner
69
blade_runner 2016.08.28 20:06  
Boeing747:
для открытия ордеров нужно добавить функцию обработки ошибок также как это сделано для закрытия ордеров чтобы в случае ошибки не пропустить сигнал.  в противном случае придется ждать следующего открытия бара

Единственно там порядок получается

if(условие на покупку) {

//ваш код в функции OnTick() 

}

 

if(условие на продажу){

//ваш код в функции OnTick()

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий