错误代码 "0"?

 

我很难理解,为什么多头头寸有效,而空头交易完全没有?

我觉得这与我的初始函数 有关,该函数 用于确定手头给定经纪商的小数位数。(因为这似乎是我第一次启动测试器时,幽灵订单被抛出的罪魁祸首...)

有谁知道为什么空方会告诉我这个错误?


提前感谢(目前代码有点乱,当然我打算把它清理干净!)。

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

   double ticksize = MarketInfo(Symbol(), MODE_TICKSIZE);
   if (ticksize == 0.00001 || ticksize == 0.001) // if you set this to 0 it WONT throw an order out straight away.
   pips = ticksize*10;
   else pips = ticksize;  
   

   return(0);
  }
//+----

//+------------------------------------------------------------------+
//| Order Enter Function                                             |
//+------------------------------------------------------------------+

void OrderEntry (int direction)
{    
   
  int PositionIndex;    //  <-- this variable is the index used for the loop
  int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool
  TotalNumberOfOrders = OrdersTotal();    // <-- we store the number of Orders in the variable
   
   
   double s12 = iMA(NULL,60,60,0,1,0,1); 
   double i121 = iMA(NULL,60,60,0,1,0,1);
   
   double LotSize=0;
   double Equity=AccountEquity();
   double RiskedAmount=Equity*RiskPercent*0.01;

   int iTBT= iBarShift(NULL,60, triggerBarTime, true),
        iHH= iHighest(NULL,60, MODE_HIGH, iTBT + 1, 0); 
            double buyPrice = High[iHH]+PadAmount*pips;
   
   
    int iTBT_1= iBarShift(NULL,60, triggerBarTime1, true),
        iLL= iLowest(NULL,60, MODE_LOW, iTBT_1 + 1, 0); 
            double sellPrice = Low[iLL]-PadAmount*pips;
            
   
   double buy_stop_price = iMA(NULL,60,60,0,1,0,1)-PadAmount*pips; 
   double pips_to_bsl = buyPrice-buy_stop_price;         
   double buy_takeprofit_price = (pips_to_bsl*RewardRatio)+buyPrice;   
   double sell_stop_price = iMA(NULL,60,60,0,1,0,1)+PadAmount*pips; 
   double pips_to_ssl = sell_stop_price-sellPrice;     
   double sell_takeprofit_price = sellPrice-(pips_to_ssl*RewardRatio);
   
//+----------------------------------------------------------------------------------------------------------------------------------------+  
//+----------------------------------------------------------------------------------------------------------------------------------------+   
   
  
if (direction==0) //--Buy--//
   {
      
      {
      double bsl=buy_stop_price;
      double btp=buy_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/10;
      if(OpenOrdersThisPair(Symbol())==0) 
      int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); 
      
      if(BuyTicketOrder > 0)
         {
         Print("Order Placed #", BuyTicketOrder);
         }
      else
         {
         Print("Order Send Failed, error # ", GetLastError());   
         }
  
      }
   }

            
if (direction==1)//--Sell--//
   {
      {
      double ssl=sell_stop_price;
      double stp=sell_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_ssl/pips))/10;    
      if(OpenOrdersThisPair(Symbol())==0)  
      int SellTicketOrder = OrderSend(Symbol(),OP_SELLSTOP,LotSize,sellPrice,3,ssl,stp,NULL,MagicNumber,0,Red); 
  
      if(SellTicketOrder > 0)
         {
         Print("Order Placed #", SellTicketOrder);
         }
      else
         {
         Print("Order Send Failed, error # ", GetLastError());   
         }
 
      }
   }
} 
 

当你发表评论时,它是否会进入交易

//if(OpenOrdersThisPair(Symbol())==0
它是否在你评论时进入交易?
LotSize = 0.1;
等等。你可以一直追溯到它开始输入交易,一旦这样,你就可能知道问题出在哪里。
 
是的,即使手数为 "0",它也是在长边进入...

改变OpenOrderThisPair也不起作用....。嗯。这很奇怪...
 
DomGilberto:
是的,即使手数为 "0",它也会进入多头......改变OpenOrderThisPair也不起作用....。嗯。这很奇怪...

如果这个测试的返回值不是0 ....

if(OpenOrdersThisPair(Symbol()) == 0)  

. . . 不调用OrderSend(),但你仍然要检查 SellTicketOrder是否大于0。

这样做 . .

if (direction==1)//--Sell--//
   {
      {
      double ssl=sell_stop_price;
      double stp=sell_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_ssl/pips))/10;    
      if(OpenOrdersThisPair(Symbol())==0)
         {
         int SellTicketOrder = OrderSend(Symbol(),OP_SELLSTOP,LotSize,sellPrice,3,ssl,stp,NULL,MagicNumber,0,Red); 
  
         if(SellTicketOrder > 0)
            {
            Print("Order Placed #", SellTicketOrder);
            }
         else
            {
            Print("Order Send Failed, error # ", GetLastError());   
            }
         }
      }
 
没有--似乎不想发送卖出指令......。

这一定是我写代码的方式有误,在发送OrderEntry函数触发订单的for循环中的 "IF "语句......
 
DomGilberto:
没有--似乎不想发送卖出指令......。

这一定是我写代码的方式有误,在发送OrderEntry函数触发订单的for循环中的 "IF "语句......

如果你没有得到一个错误,也没有得到 "订单放置#12345",那么OrderSend()没有被调用,你的OpenOrdersThisPair()函数 有问题 ...公布你的代码。
 
当它运行时,对多头来说工作正常(我在过去2个小时里一直在玩这个)。问题是,我很可能会让你和某个人失望,因为我知道我在哪里出了问题(在我调用 "CheckForMaTrade "函数 的地方),与移动平均线参数有关的IF语句,以及如果它们是 "真",它将把OrderEntry发送到OrderSend。问题是,我仍在学习如何正确编写这部分内容......
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+

int start()
  {
//----
   
   if(OpenOrdersThisPair(Symbol())>=1)
      {
      if(UseMoveToBreakEven)MoveToBreakEven();
      if(UseTrailingStop)AdjustTrail();
      if(Use_MA_Trail)MA_Trail();
      }
      if(IsNewCandle())CheckForMaTradeLong();
      if(IsNewCandle())CheckForMaTradeShort();
//----
   return(0);
  }
 
DomGilberto:
当它运行时,对多头来说工作正常(我在过去2个小时里一直在玩这个)。问题是,我很可能会让你和某个人失望,因为我知道我在哪里出了问题(在我调用 "CheckForMaTrade "函数的地方),与移动平均线参数有关的IF语句,以及如果它们是 "真",它将把OrderEntry发送到OrderSend。问题是,我还在学习如何正确编写这部分内容...

RaptorUK
如果你没有得到一个错误,也没有得到 "Order placed # 12345",那么OrderSend()没有被调用,你的OpenOrdersThisPair()函数有问题 ......公布你的代码。


那么 ....你得到什么错误,等等 ......
 
哦,对不起--我不再有任何错误了。我只看到买单通过,没有卖单......。

这与我之前关于MA交叉的话题有关--我还是不明白!但我不想在人们给我提供信息的时候,让大家觉得我是个死脑筋。但我不想在别人给我答案的时候,把别人的问题绕过去,打一个死结(虽然我不明白这个答案)!我希望能有更多的人参与进来。谢谢RaptorUK的帮助!
 
     if(IsNewCandle())CheckForMaTradeLong();
     if(IsNewCandle())CheckForMaTradeShort();
虽然我支持将操作分解到函数 中,但我不支持新蜡烛/新蜡烛的大多数变化,因为该函数只能被调用一次[per start()] 。
int start(){
   static datetime time0; bool isNewCandle = time0 != Time[0]; time0 = Time[0]; // Once per start only.
   :
      if(isNewCandle)CheckForMaTradeLong();
      if(isNewCandle)CheckForMaTradeShort();
 
谢谢WHRoeder - 很好的提示!