订单关闭不工作 - 页 2

 
chuale:

大家好。


现在我在OrderClose中插入了票据和手数,而没有使用OrderTicket()和OrderLots(),但它也没有关闭订单。请帮助我。



你有几件事做错了。我假设你想让这个EA在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:


票是一个局部变量,所以下次勾选时,它将不会有相同的值

放在函数之外,使其成为全局性 的。

 
   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(),对吗?


你好,Chuale。

这里有一个简单的方法来选择你的订单,并通过符号和魔法号码来关闭订单。

//+------------------------------------------------------------------+
//|                                                 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(),对吗?


再次问候Chuale。

我在USDJPY上玩了一下你的想法,如果不做一些改变,我无法得到积极的结果。这里是我在M1图表上对USDJPY的结果样本。

美元兑日元在M1上

你打算在不同的货币对上使用它吗?

在bar3<-1或bar3>1时退出并没有得到积极的结果。

 
deVries:

?????? ..... 无用

正确检查你有哪些交易

寻找正确的符号和正确的魔法数字

通过一个订单循环,你可以选择正确的交易来关闭。

.

用你的方法

当你重新启动你的电脑时,你会失去票据价值,所以

失败.....


如果你的意思是这不是关闭订单的最佳方式,我同意,但如果这个人不想使用OrderSelect(或不知道如何使用),并且不在市场上留下任何未结订单,那么它就能发挥作用。

我们试图在这里互相帮助,但你的回答没有起到一点作用,你没有告诉他如何使用订单选择功能,他的EA现在也没有因为你的评论而更好地工作。

下次你想帮忙的时候,用正确的方法,把正确的代码放在那里,这样别人就能真正学到东西。

 
thrdel:


你有几件事做错了。我假设你想让这个EA在M1时间框架的日元对上工作。你是想只在新条上下单,只在新条上平仓,还是想在新条上进场,如果满足条件就出场?这是我的想法。

首先,你用OrdersTotal()计算订单。

然后计算你的变量

如果市场上有订单,检查它们是否必须被关闭

如果市场上没有订单,检查是否满足进入条件。

如果你有任何问题,请告诉我。