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

 
Спасибо ГумРай
 

Здравствуйте,


Я прикрепляю советника к нескольким графикам различных валют. Советник будет открывать много ордеров на одном графике, если выполняются условия. Каким кодированием обеспечить только один ордер на графике?

 
chuale:

Здравствуйте,


Я прикрепляю советника к нескольким графикам различных валют. Советник будет открывать много ордеров на одном графике, если выполняются условия. Как закодировать, чтобы на одном графике был только один ордер?


Перебирайте открытые ордера и проверяйте наличие магического номера и символа.

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

PS. Вам действительно следовало бы начать новую тему, так как ваш вопрос никак не связан с названием темы :)

 
chuale:

Привет, Трдель,

Time[0] относится к времени бара 0? Есть ли Time[1], Time [2] и т.д.? Я пытался погуглить, но в интернете не так много информации. Также, если я прикреплю этот советник к двум валютным парам, означает ли это, что OrderSelect выбирает только ордера на самом графике или все ордера в терминале?




Time[0] - это время начала текущего бара. Да, Time[1] - это время начала предыдущего бара и так далее.

Если вы хотите запустить один и тот же советник на нескольких графиках, вам нужно убедиться, что переменная "MagicMunber" различна для каждого советника, даже если у вас один и тот же символ на разных графиках.

Тогда советники не будут мешать ордерам друг друга.

OrderSelect() получает значение не с графика, а с сервера.

Информация о вашем счете и ордерах хранится на сервере, поэтому, когда вы выключаете компьютер, ваш ордер stop или tp все еще исполняется.

 
chuale:

Привет, thrdel,


Почему я получаю это предупреждение "implicit conversion from 'number' to 'string' postin forum.mq4 69 61" для кодировки " if(ticket<0)Print("Error OP_BUY order failed, error: "+GetLastError());"?


Если вы хотите отобразить двойную переменную с помощью Comment() или вывести ее на печать с помощью Print(), вы должны преобразовать ее в строку с помощью функции DoubleToString().

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

 
chuale:

Здравствуйте,


Я прикрепляю советника к нескольким различным валютным графикам. Советник будет открывать много ордеров на одном графике, если выполняются условия. Каким кодом обеспечить только один ордер на график?


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

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

MagicNumber - это переменная, вы должны убедиться, что она разная на каждом графике!

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

Вы можете сами провести несколько тестов и посмотреть, как это работает, я тестировал это на USDJPY.

Переменные Max и Min заменяют значения 1 и -1 в вашем условии, так что вы можете оптимизировать и посмотреть, работают ли другие значения лучше.


if(bar2 <-1) //changed to 
if(bar2 < Min
if(bar2 > 1) //changed to 
if(bar2 > Max

Вы знаете, как оптимизировать параметры?

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

Вот код:

//+------------------------------------------------------------------+
//|                                                 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=150;
extern double   Lots=0.1;
extern double   StopLoss=300;
extern int      Max = 6;
extern int      Min = -9;
extern int      MagicNumber = 12345;
extern int      Slip  = 3;
double     bar1;
double     bar2;
double     bar3;
double     bar3max,bar3min;
int        myTrades,ticket;
datetime   previousTime;
int        xMultiply;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

//---
if(Digits==3) xMultiply=100;
if(Digits==5) xMultiply=10000;
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
 
   myTrades = CountTrades();
//
   bar1=(iClose(Symbol(),0,2)-iClose(Symbol(),0,3))*xMultiply;
   bar2=(iClose(Symbol(),0,1)-iClose(Symbol(),0,2))*xMultiply;
   bar3=(iClose(Symbol(),0,0)-iClose(Symbol(),0,1))*xMultiply;
   //
   if(myTrades>0)
     {
      if(bar3<Min) CloseThisSymbolAll("OP_BUY");
      if(bar3>Max) CloseThisSymbolAll("OP_SELL");
     }
  //
   if(Time[0]==previousTime) return(0);    
   previousTime=Time[0];          
   //
   if(myTrades<1)
     {
      if(bar2>1)
        {
         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()); 
         return(0);
        }
      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(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(string direction)
  {
  string dir = direction;
   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 && dir == "OP_BUY")OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Blue);
         if(OrderType()==OP_SELL&& dir == "OP_SELL")OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);
        }
     }
  }
//========================================================================
 

Привет, Трдель,


Большое спасибо. Вы очень любезны и полезны. Я сначала пройдусь по вашей кодировке. Еще раз спасибо.

 

Привет, Трдель,

Это означает, что я должен попробовать разные значения Max и Min для каждого бэктеста, чтобы определить, какое значение является наиболее оптимальным?

Спасибо

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