Код ошибки "0"?

 

Я пытаюсь понять, почему длинные позиции работают, а короткие сделки не работают вообще?

У меня есть ощущение, что это как-то связано с моей функцией init для определения количества десятичных знаков при данном брокере. (так как это, похоже, является виновником того, почему фантомные ордера выбрасываются в самом начале, когда я впервые инициирую тестер...)

У кого-нибудь есть идеи, почему короткая сторона говорит мне эту ошибку?


Заранее спасибо (код немного беспорядочен на данный момент, я намерен очистить его, конечно!)

//+------------------------------------------------------------------+
//| 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;
и т.д. проделайте обратный путь, пока он не начнет вводить сделки, как только это произойдет, вы, вероятно, поймете, в чем проблема. hth
 
Да, он входит в длинную сторону даже с размером лота "0"...

Изменение OpenOrderThisPair тоже не работает..... Хммм... Это очень странно...
 
DomGilberto:
Да, он входит в длинную сторону даже с размером лота "0"...

Изменение OpenOrderThisPair тоже не работает..... Хммм... Это очень странно...

Если этот тест возвращает ненулевое значение . . .

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());   
            }
         }
      }
 
Нет - похоже, не хочет отправлять ордер на продажу...

Наверное, это ошибка в том, как я написал код относительно операторов "IF" в цикле for, который посылает функцию OrderEntry для запуска ордера...
 
DomGilberto:
Неа - похоже, не хочет отправлять ордер на продажу...

Наверное, это ошибка в том, как я написал код относительно операторов "IF" в цикле for, который посылает функцию OrderEntry для запуска ордера...

Так какую ошибку вы получаете сейчас? Если никакой, и вы не получаете "Order placed # 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() ... опубликуйте ваш код.


Итак ... . . какую ошибку вы получаете и т.д. ...
 
О, простите - я больше не получаю никаких ошибок. Я получаю только проходящие ордера на покупку и никаких ордеров на продажу...

Это связано с моей предыдущей темой о пересечении МА - я все еще не понимаю! Но я не хочу никого заводить и бить мертвую лошадь, в то время как люди дают мне ответ (хотя я не понимаю ответа lol)! Спасибо RaptorUK за вашу помощь!
 
     if(IsNewCandle())CheckForMaTradeLong();
     if(IsNewCandle())CheckForMaTradeShort();
Хотя я поддерживаю факторизацию операций в функции, я не делаю этого для большинства вариаций New Candle/New Bar, потому что эта функция может быть вызвана только ОДИН раз [на 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 - хороший совет!
Причина обращения: