OrderClose не работает - страница 2

 
chuale:

Привет всем,


Теперь я вставляю билет и лоты в OrderClose без использования OrderTicket() и OrderLots(), но это не закрывает ордер. Пожалуйста, помогите.



Есть несколько вещей, которые вы сделали неправильно. Я предполагаю, что вы хотите, чтобы этот советник работал на парах JPY на таймфрейме M1. Вы хотите размещать ордера только на новом баре и закрывать ордера только на новом баре или вы хотите, чтобы вход был на новом баре и выход при выполнении условий? Вот что я думаю:

Сначала вы подсчитываете ордера с помощью OrdersTotal().

Затем вычисляете свои переменные

Если в рынке есть ордера, проверьте, должны ли они быть закрыты.

Если ордеров на рынке нет, проверьте, выполнены ли условия входа.

Дайте мне знать, если у вас есть какие-либо вопросы.

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

extern double   TakeProfit=500;
extern double   Lots=0.1;
extern double   StopLoss=300;

double     bar1;
double     bar2;
double     bar3;
int        total,ticket;
datetime   previousTime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

//---

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
   total=OrdersTotal();
/*
  counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
  IndicatorCounted() is actually for indicators not EA
  
   */

   bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
   bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
   bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;
   /*
   Comment("Bar1 = "+DoubleToString(bar1,Digits)+"\n"+
           "Bar2 = "+DoubleToString(bar2,Digits)+"\n"+
           "Bar3 = "+DoubleToString(bar3,Digits)+"\n"
           );
   */
//Close any orders if conditions are met
   if(total>0)
     {
      if(bar3<-1) OrderClose(ticket,OrderLots(),Bid,3,Green);
      if(bar3>1) OrderClose(ticket,OrderLots(),Ask,3,Red);
     }
   if(Time[0]==previousTime) return(0);         //EA will not go past this point unless it is a new bar
   previousTime=Time[0];                        // If it was a new bar , it's old now but continue to the end
// if no order open and new bar
   if(total<1)
     {
      if(bar2>1)// if condition met
        {
         //place buy order
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",12345,0,Green);
         if(ticket<0)Print("Error OP_BUY order failed. error : "+GetLastError()); // if returned ticket is -1 OrderSent failed
         return(0);
        }
      // or if conditions for sell met
      if(bar2<-1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",12345,0,Red);
         if(ticket<0)Print("Error OP_SELL order failed. error : "+GetLastError());
         return(0); //return to start
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
Файлы:
 
GumRai:


билет является локальной переменной, поэтому при следующем тике он не будет иметь то же значение

Поместите за пределы функций, чтобы сделать ее Globalscope

 
   total=OrdersTotal();

?????? ..... бесполезно

проверьте правильно, какие сделки у вас есть

ищите правильный символ и правильное магическое число

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

OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Green);

.

с вашим методом

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

   if(total>0)
     {
      if(bar3<-1) OrderClose(ticket,OrderLots(),Bid,3,Green);
      if(bar3>1) OrderClose(ticket,OrderLots(),Ask,3,Red);
     }

не работает .....

 
chuale:

Почему вы процитировали мое сообщение, а затем не добавили комментарий?
 
да, теперь он может закрыться. спасибо GumRai. теперь я знаю, что номер тикета продолжает меняться в зависимости от тиков, так как же получить номер тикета открытого ордера? Я должен использовать OrderTicket(), правильно?
 
chuale:
да, теперь он может закрыться. спасибо GumRai. теперь я знаю, что номер тикета продолжает меняться в зависимости от тиков, так как же получить номер тикета открытого ордера? Я должен использовать OrderTicket(), правильно?

Если вы используете OrderTicket(), то просто убедитесь, что вы сначала используете OrderSelect(), а также убедитесь, что это та сделка, которую вы хотите закрыть.
 
chuale:
Да, теперь он может закрыться. Спасибо GumRai. Теперь я знаю, что номер тикета продолжает меняться в зависимости от тиков, так как же получить номер тикета открытого ордера? Я должен использовать OrderTicket(), правильно?


Привет, Чуале,

Вот простой способ выбора ордеров и закрытия ордеров по символу и по номеру Magic:

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

extern double   TakeProfit=500;
extern double   Lots=0.1;
extern double   StopLoss=300;
extern int      MagicNumber = 12345;
extern int      Slip  = 3;
double     bar1;
double     bar2;
double     bar3;
int        myTrades,ticket;
datetime   previousTime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

//---

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
   myTrades = CountTrades();//Count trades function counts this EA trades only
//
   bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
   bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
   bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;

//Close any orders if conditions are met
   if(myTrades>0)
     {
      if(bar3<-1) CloseThisSymbolAll();
      if(bar3>1) CloseThisSymbolAll();
     }
   if(Time[0]==previousTime) return(0);         //EA will not go past this point unless it is a new bar
   previousTime=Time[0];                        // If it was a new bar , it's old now but continue to the end
// if no order open and new bar
   if(myTrades<1)
     {
      if(bar2>1)// if condition met
        {
         //place buy order
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",MagicNumber,0,Green);
         if(ticket<0)Print("Error OP_BUY order failed. error : "+GetLastError()); // if returned ticket is -1 OrderSent failed
         return(0);
        }
      // or if conditions for sell met
      if(bar2<-1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",MagicNumber,0,Red);
         if(ticket<0)Print("Error OP_SELL order failed. error : "+GetLastError());
         return(0); //return to start
        }
     }
   return(0);
  }
//========================================================================
int CountTrades()
{
int count=0;
int trade;
for(trade=OrdersTotal()-1;trade>=0;trade--)
   {
   OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
   if(OrderSymbol()!=Symbol() || OrderMagicNumber() != MagicNumber)
   continue;
   if(OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber)
   if(OrderType()==OP_SELL || OrderType()==OP_BUY)
   count++;
   }
return(count);
}
//========================================================================
void CloseThisSymbolAll()
  {
   int trade;
   for(trade=OrdersTotal();trade>=0;trade--)
     {
      OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()!=Symbol()) continue;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
        {
         if(OrderType()==OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Blue);
         if(OrderType()==OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);
        }
      //Sleep(1000);
     }
  }
//========================================================================
 
chuale:
Да, теперь он может закрыться. Спасибо GumRai. Теперь я знаю, что номер тикета продолжает меняться в зависимости от тиков, так как же получить номер тикета открытого ордера? Я должен.использовать OrderTicket() правильно?


Привет еще раз, Чуале,

Я играл с вашей идеей на USDJPY и не смог добиться положительных результатов без некоторых изменений.Вот пример моих результатов на USDJPY на графике M1:

USDJPY на M1

Вы собирались использовать это на другой паре?

Выход на bar3 < -1 или bar3 > 1 не дал положительных результатов.

 
deVries:

?????? ..... бесполезно

проверьте правильно, какие сделки у вас есть

ищите правильный символ и правильное магическое число

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

.

с вашим методом

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

не работает .....


Если вы имеете в виду, что это не лучший способ закрыть ордер, то я согласен, но если парень не хочет использовать OrderSelect (или не знает как) и не оставляет открытых ордеров на рынке, то это работает.

Мы пытаемся помочь друг другу здесь, и ваш ответ ничуть не помог, вы не показали ему, как использовать функцию Order Select, и его советник теперь работает не лучше из-за вашего комментария.

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

 
thrdel:


Есть несколько вещей, которые вы сделали неправильно. Я предполагаю, что вы хотите, чтобы этот советник работал на парах JPY на таймфрейме M1. Вы хотите размещать ордера только на новом баре и закрывать ордера только на новом баре или вы хотите входить на новом баре и выходить, если условия выполнены? Вот что я думаю:

Сначала вы подсчитываете заказы с помощью функции OrdersTotal().

Затем вычисляете свои переменные

Если в рынке есть ордера, проверьте, должны ли они быть закрыты.

Если ордеров на рынке нет, проверьте, выполнены ли условия входа.

Дайте мне знать, если у вас есть вопросы.

Причина обращения: