订单关闭不工作 - 页 5

 
谢谢GumRai
 

你好。


我把EA附在几个不同的货币图表上。如果条件满足,EA将在一个图表中开出许多订单。怎样编码才能确保每个图表只有一个订单?

 
chuale:

你好。


我把EA附在几个不同的货币图表上。如果条件满足,EA将在一个图表中开出许多订单。怎样的编码才能确保每个图表只有一个订单?


循环查看未结订单,并检查 神奇的数字和符号。

如果已经有一个订单了,就不要再开了。

PS.你真的应该开一个新的主题,因为你的问题与这个主题的标题没有任何关系:)

 
chuale:

嗨,threwel。

Time[0]是指第0条的时间吗?是否有Time[1],Time[2]等?我试着用谷歌搜索了一下,但网上的信息不多。另外,如果我把这个EA连接到两个货币对上,这是否意味着OrderSelect只选择图表本身的订单,还是终端的所有订单?




Time[0]是当前 条形图开始的时间。是的,Time[1]是上一个柱子开始的时间,以此类推。

如果您想在多个图表上运行同一个EA,您需要确保每个EA的 "MagicMunber "变量是不同的,即使您在不同图表上有相同的符号。

这样,EA的订单就不会相互干扰了。

OrderSelect()并不是从图表上获取数值,而是从服务器上获取。

关于您的账户和订单的信息存储在服务器上,这就是为什么当您关闭您的电脑时,您的订单止损或止盈仍然被执行。

 
chuale:

嗨,threwel。


为什么我在编码 "if(ticket<0)Print("Error OP_BUY order failed, error: "+GetLastError()); "时得到这个警告信息 "implicit conversion from 'number' to 'string' postin forum.mq4 69 61"?


如果你想用Comment()显示一个双倍变量,或者你想用Print()打印,你必须用DoubleToString()函数 将其转换成字符串。

对于int变量来说,转换是很明显的,所以如果你不使用IntToString()来做,它仍然会编译和工作,因为它是如此明显。

 
chuale:

你好。


我把EA附在几个不同的货币图表上。如果条件得到满足,EA将在一个图表中打开许多订单。怎样的编码才能确保每个图表只有一个订单?


你好,Chuale。

我对你的EA做了一些修改,使其能够正常工作。

MagicNumber是一个变量,你必须确保它在每个图表上都是不同的!

如果你想让我向你解释为什么以及这些改动是如何工作的,请联系我,如果可以的话,我很乐意帮助你。

你可以自己运行一些测试,看看它是如何工作的,我在USDJPY上测试过。

最大和最小变量在你的条件中取代了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);
        }
     }
  }
//========================================================================
 

嗨,threwel。


非常感谢你。你是非常善良和有帮助的。我会先通过你的编码。再次感谢。

 

嗨,Thrdel。

这意味着我必须在每个回溯测试 中尝试不同的最大和最小值,以确定哪个是最优化的值?

谢谢