エラーコード "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;
など、トレードを開始するまで遡り、そこで一度、何が問題なのかが分かるでしょう。
 
ロットサイズ "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 "ステートメントに関するコードの書き方が間違っているのでしょう。

それで、今どんなエラーが出るのですか? もし出ないのなら、そして「Order placed # 12345」が出ないのなら、OrderSend() は呼び出されておらず、OpenOrdersThisPair()関数に 問題があります ... あなたのコードを投稿してください。
 
これが実行されると、ロングサイドでは問題なく動作します(私は過去2時間これをいじり回しただけです)。というのも、移動平均のパラメーターに関連するIF文に関して、どこで間違っているのか(「CheckForMaTrade」関数を 呼び出すところ)、そして、もしそれが「true」なら、どのようにして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時間これをいじくりまわしていたところです)。というのも、移動平均のパラメーターに関連するIF文に関して、どこで間違っているのか(「CheckForMaTrade」関数を呼び出すところ)、そして、もしそれが「true」なら、どのようにしてOrderEntryをOrderSendに送るのかが分かっているからです......つまり、私はあなたとある誰かを巻き込んでしまう可能性が高いのです。問題は、私はまだその部分を適切に書く方法を学んでいるところです...

RaptorUK です。
もし、「Order placed # 12345」と表示されなければ、OrderSend()は呼び出されておらず、OpenOrdersThisPair()関数に問題があることになります。


では、....... どのようなエラーが発生するかなど ... ...
 
あ、すみません、もうエラーは一切出ません。私は買い注文が通過し、売り注文が ないことを得ています...

それはMAクロスオーバーに関する私の前のスレッドに関連している - 私はまだそれを得ることはありません!しかし、私は誰かを巻き込むと、人々が私に与える一方で死んだ馬を打つしたくない。しかし、私は誰も巻き込みたくないし、人々が私に答えを与えている間、死んだ馬を打つ(私は答えを理解していないが(笑))!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!。RaptorUKさん、ありがとうございました。
 
     if(IsNewCandle())CheckForMaTradeLong();
     if(IsNewCandle())CheckForMaTradeShort();
私は操作を関数に ファクタリングすることを支持していますが、New Candle/New Barのほとんどのバリエーションについては、この関数は1回しか呼び出すことができないので、そうしません[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さん、ありがとうございます。
理由: