在给定时间和/或SL后自动关闭订单 - 页 3

 

这是非常错误的 . .

OrderSelect(BuyTicket || SellTicket, SELECT_BY_TICKET);

(BuyTicket || SellTicket)的结果是真或假 . . . 在这种情况下,真或假将被视为1或0 . . . 不是你的SellTicket或BuyTicket号码 .

Stoploss = 40 . . . . 当你在OrderSend中使用止损时,它是一个价格 . . . 不是一个点数,滑点是一个点数 . . . 阅读文档。OrderSend

止损 - 止损水平。
获利 - 获利水平。
 

好的,我知道你的意思,所以我需要一个命令来选择订单,同时使用OrderSelect...或者OrderSelect在这种情况下通常是错误的?

 

阅读文档 . . 你使用OrderLots、OrderTicket、OrderOpenPrice等功能之前,需要使用OrderSelect 来选择订单 "注意:订单必须是之前 OrderSelect() 函数选择的

如果你不需要使用与现有订单有关的信息,你就不需要OrderSelect,如果你需要......那么你就需要。

 
RaptorUK:

阅读文档 . . 你使用OrderLots、OrderTicket、OrderOpenPrice等功能之前,需要使用OrderSelect 来选择订单 "注意:订单必须是之前 OrderSelect() 函数选择的

如果你不需要使用与现有订单有关的信息,你就不需要OrderSelect。如果你需要 ... ... 那么你就需要。


目前我认为我需要这些信息,因为如果在市场上有一个头寸,我需要关闭它并替换成另一个。我认为OrderSelect可以帮助我。但是,如果订单选择只是针对未平仓订单,而不是针对市场上的有效头寸,那就没有用了。我说的对吗?

但是,如果OrderSelect没有帮助,我怎样才能关闭活动头寸?

问候

马克

 
如果你不使用挂单,而你有未结订单,那么它们将是买入或卖出 ......市场订单。
 
//+------------------------------------------------------------------+
//| Der Stundentrader.mq4 |
//| Der Marc |
//| Es gibt gar keine Internetseite |
//+------------------------------------------------------------------+
#property copyright "Der Marc"
#property link "Es gibt gar keine Internetseite"

//Wichtige Variablen
extern double Minlot=0.01;
extern int Digits2Round=2;
extern int PercentOfFreeDepo=1;
extern int Slippage=5;
extern int MagicNumber =1;
extern int TradeHour3=3;
extern int TradeHour4=4;
extern int TradeHour7=7;
extern int TradeHour10=10;
extern int TradeHour17=17;
extern int TradeHour18=18;
extern int TradeHour20=20;
extern int TradeHour12=12;
extern int TradeHour23=23;
extern int StopLoss=40;

//Globale Variablen
int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;

int openbuy = 0;
int opensell = 0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(), Slippage);
}

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round);
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round);
double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round);
//===================== Lets determine lot size and risk ===================================
if ( Lot<Minlot )
{
Lot=Minlot;
}
Comment( "\n","Acceptable risk is ",PercentOfFreeDepo, "% = ",Risk," of the free money ",FreeDepo," in lots = ",Lot);
for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
       if((OrderOpenTime()+3600) < TimeCurrent())
          { 
           if (OrderType() == OP_BUY)          
              {
               bool Closed = OrderClose(OrderTicket() ,OrderLots(), Ask, UseSlippage, Red);           
               openbuy = 0;
              }
           if (OrderType() == OP_SELL)          
              {
               Closed = OrderClose(OrderTicket() ,OrderLots(), Bid, UseSlippage, Red);  
               opensell = 0;         
              }              
          }
       }
    }


//BuyOrder 
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,0,"time trader buy order ",MagicNumber,0,Blue);
}
//SellOrder
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
  opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0,"time trader sell order ",MagicNumber,0,Green);
} 

//----
return(0);
}
//+------------------------------------------------------------------+
//Pip Point Function
double PipPoint (string Currency)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;
return (CalcPoint);
}

//Get Slippage Function
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return (CalcSlippage);
}

This seems to be mostly correct, but now I need to know why the prog only executes the sell order @ 12 & 23...and not the buy orders...?
 

nirvanamac:

这似乎大部分是正确的,但现在我需要知道为什么程序只执行12和23的卖单...而不执行买单...?

它可能是这样的......而且它可能产生了一个你没有捕获的错误......。

尝试一下 ...

//BuyOrder 
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,0,"time trader buy order ",MagicNumber,0,Blue); 
  if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() );
}
//SellOrder
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
  opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0,"time trader sell order ",MagicNumber,0,Green);
  if (opensell < 0) Print("OrderSend OP_SELL failed, error: ", GetLastError() );

} 

你的OrderClose是错误的 ......你在Ask开了一个Buy,关闭Buy你Sell ......你在Bid卖出,你在Bid开了一个Sell,关闭Sell你Buy ......你在Ask购买。

 
RaptorUK:
你的OrderClose是错误的 ......你在Ask开了一个Buy,为了关闭Buy你Sell ......你在Bid上Sell,你在Bid上开了一个Sell,为了关闭Sell你Buy ......你Buy。
或者,由于你已经选择了订单,只需使用
Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red);  
而且你不必区分订单类型
 

非常感谢你对我的帮助......我根据你的提示修改了代码。它看起来是这样的。

//+------------------------------------------------------------------+
//| Der Stundentrader.mq4 |/| Der Marc
//|Der Marc |/|
//| Es gibt gar keine Internetseite |/|
//+------------------------------------------------------------------+
#财产版权"Der Marc"
#属性链接 "Es gibt gar keine Internetseite"

//Wichtige Variablen
外部双数Minlot=0.01。
外部int Digits2Round=2;
外部int PercentOfFreeDepo=1;
外置 int Slippage=5;
外置 int MagicNumber =1;
extern int TradeHour3=3;
extern int TradeHour4=4;
extern int TradeHour7=7;
extern int TradeHour10=10;
extern int TradeHour17=17;
extern int TradeHour18=18;
extern int TradeHour20=20;
extern int TradeHour12=12;
extern int TradeHour23=23;
外置 int StopLoss=400;

//全局变量
int BuyTicket;
int SellTicket;
Double UsePoint;
int UseSlippage;

int openbuy = 0;
int opensell = 0;
//+------------------------------------------------------------------+
//|专家初始化函数 |
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol())。
UseSlippage = GetSlippage(Symbol(), Slippage);
}

//+------------------------------------------------------------------+
//|专家启动功能|
//+------------------------------------------------------------------+
int start()
{
double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(), Digits2Round);
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100), Digits2Round);
double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round);
//===================== 让我们确定手数和风险 ===================================
如果 ( Lot<Minlot )
{
Lot=Minlot。
}
Comment( "/n", "可接受的风险是 ",PercentOfFreeDepo, "% = ",Risk," of the free money ",FreeDepo," in lots = ",Lot);
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
如果((OrderOpenTime()+3600) < TimeCurrent()
{
如果(OrderType() == OP_BUY || OP_SELL)
{
bool Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red);
openbuy = 0;
opensell = 0。
}
如果(OrderType() == OP_SELL)
{
Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red)。
opensell = 0;
openbuy = 0。
}
}
}
}
//买入订单
如果((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20==Hour()) && openbuy == 0) //信号买入
{
openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,Ask - StopLoss * Point,0, "time trader buy order",MagicNumber,0,Blue) 。
if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() );
}
//SellOrder
如果((TradeHour12==Hour())|(TradeHour23==Hour())&& opensell ==0) //卖出信号
{
opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0, "time trader sell order",MagicNumber,0,Green)。
if (opensell < 0) Print("OrderSend OP_SELL failed, error: " , GetLastError() );
}

//----
return(0);
}
//+------------------------------------------------------------------+
//Pip Point功能
double PipPoint (string Currency)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(Calcdigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
否则如果(Calcdigits == 4 || CalcDigits == 5) CalcPoint = 0.0001。
返回(CalcPoint)。
}

//获取滑移量函数
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
如果(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
否则如果(Calcdigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
返回(CalcSlippage)。
}

在运行回测时,有一个错误信息ERR_INVALID_TICKET(4108)。

 

不是所有的订单都被执行

会不会是错误属于之前触发了SL的事实?