エラー130を地獄に落とす - ページ 3

 
delcor wrote>>

バングローシュ

ご意見ありがとうございます。

このような場合、どうすればよいのでしょうか?

これは正しいのでしょうか?

私は自動トレール付きのEAを使っています

if(OrderType()==OP_SELL && OrderSymbol()==Symbol()))

{
if (OrderStopLoss()==0)
{
オーダーモディファイ(オーダーチケット(),オーダーオープンプライス(),アスク+ポイント*トレイリングストップ,オーダーテイクプロフィット(),0,レッド); // TPとSLを配置する
}
if((注文開始価格()-アスク)>(ポイント*トレイリングストップ))// TPを置く
{
if(OrderStopLoss()>(Ask+Point*TrailingStop)+Point))//チェックトゥルー
{
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red)) // if true modify order.
Print("Error_Modify - ",GetLastError())。
else str=StringConcatenate("\n My ticket number is ", OrderTicket(), " and my stop loss setting is ", DoubleToStr(Ask+Point*TrailingStop,Digits)); // new code
}
}
}

以下は、別の記事で書いた、異なるアプローチについての説明です。

>>新しいストップロス価格が古いストップロス価格より少なくとも1ポイント以上高いことを確認するだけで、簡単に修正できます。売り注文の場合は、その逆をするだけです。

      if (OrderType() == OP_BUY)
      {      
         if(Bid-OrderOpenPrice() > (Point* TrailingStop))
         {       
            double oldStopLoss = OrderStopLoss();
            double newStopLoss = Bid-Point* TrailingStop;
            double nextStopLoss = oldStopLoss + Point; // Adding 1 point to oldStopLoss, i.e. 76.78 to 76.79            
                       
            if( newStopLoss >= nextStopLoss) // checking that the new stoploss price is at least 1 point or greater then the old stoploss
            {                              
               OrderModify(OrderTicket(),OrderOpenPrice(), newStopLoss,0,0,Green);
               return;
            }
         }
      }


これが私が使っている関数の完全版です。今思うと、nextStopLossという変数名をもっとうまく使うことができたと思います。

また、私のトレイリングストップ関数は、複数の注文を同時に開くことができるEAにあり、そのため、複数の注文のトレイリングストップを同時に更新できるように、これらのパラメータを持っています。

void CheckTrailingStop(int order_Ticket, int trailingStopValue)
{
   double oldStopLoss;
   double newStopLoss;
   double nextStopLoss;
   int _trailingStop = trailingStopValue;
   
   if ( order_Ticket < 0) return;
                                    
   if(OrderSelect( order_Ticket, SELECT_BY_TICKET, MODE_TRADES) == false)
   {
      Print("CheckTrailingStop() - OrderSelect returned the error of ", GetLastError());
      return;   
   }
         
   if (OrderType() == OP_BUY)
   {      
      if(Bid-OrderOpenPrice() > Point*_trailingStop)
      {       
         oldStopLoss = OrderStopLoss();
         newStopLoss = Bid-Point*_trailingStop;
         nextStopLoss = oldStopLoss + Point; // Adding 1 point to oldStopLoss, i.e. 76.78 to 76.79            
                    
         if( newStopLoss >= nextStopLoss)
         {                              
            OrderModify(OrderTicket(),OrderOpenPrice(), newStopLoss,0,0,Green);
            return;
         }
      }
   }
                                             
   if (OrderType() == OP_SELL)
   {               
      if(OrderOpenPrice()-Ask > Point*_trailingStop)
      {
         oldStopLoss = OrderStopLoss();
         newStopLoss = Ask+Point*_trailingStop;
         nextStopLoss = oldStopLoss - Point; // Subtracting 1 point from oldStopLoss, i.e. 76.78 to 76.77
                    
         if( newStopLoss <= nextStopLoss || (OrderStopLoss() == 0))
         {                              
            OrderModify(OrderTicket(),OrderOpenPrice(), newStopLoss,0,0,Green);
            return;
         }
      }
   }
}

次に、start()関数にあります。

void start()
{                      
   if ( validTimePeriod == false) return;
   if ( validTrailingStop == false) return;
        
   //---- Start Main program ----
   Main();
   
   if ( EnableHedging == true)
   {
      HedgeStopLossCheck();
      CheckHedges();
   }
   
   if ( TrailingStop > 0) CheckTrailingStop( currentOrderTicket, TrailingStop);               
           
   CheckWaiting();
   
   GetOpenTradeLots();   
      
   CheckIfCurrentOrder_Closed();
}

他の関数呼び出しはそのままにしてあります。これは、私が自分のコードをできるだけ特定の関数に分割するのが好きだということがおわかりいただけると思います。そうすることで、物事がとても簡単になります。

あなたのEAがうまくいくことを祈っています。

 
vangrosh:

以下は、私が別の投稿で書いた、異なるアプローチについての説明です。

>>新しいストップロスの価格が古いストップロスより少なくとも1ポイント以上大きいことを確認するだけで、簡単に修正できます。売り注文の場合は、その逆をするだけです。


以下は私が使っている関数です。今思うと、nextStopLossという変数名をもっとうまく使うことができたと思います。

また、私のトレイリングストップ関数は、複数の注文を同時に開くことができるEAにあり、そのため、複数の注文のトレイリングストップを同時に更新できるように、これらのパラメータを持っています。

次に、start()関数にあります。

他の関数コールを残しておいたのは、私が自分のコードをできるだけ特定の関数に分割したいからです。そうすることで、物事がとても簡単になります。

あなたのEAで幸運を祈ります。

ありがとうございます - いい感じです

スタート() 数をEAの一番下に配置するのですか?

 
私もひどいエラーに悩まされています。ストップロスやテイクプロフィットを 設定していないのですが、問題ないはずのマーケットから何ピップも離れたところにある保留中のオーダーを置くのに失敗しているのです。
 
TheEconomist wrote>>
私もドレッドエラーで困っています。ストップロスもテイクプロフィットもないのですが、問題ないはずのマーケットから何ピプスも離れたところに、ただ保留中の注文を置くのに失敗するのです...。

130の問題は、それがエラーのクラスまたはグループを示すことであり、即座に修正することにつながらないということです...
あなたは問題を修正することができますし、それはまだそこにある

ここで発生するのは、タイプミスだけ?

買い逆指値注文のつもりが、Askより上の買い指値を入力しているのでは?

FWIW

-BB-

 
BarrowBoy:

good'ole 130の問題は、それがエラーのクラスまたはグループの(の1つ)を示し、任意の即座の修正に1つをリードしていないことです。
あなたは問題を修正することができますし、それはまだそこにある

ここで発生するのは、タイプミスだけ?

買い逆指値注文のつもりが、Askより上の買い指値を入力しているのでは?

FWIW

-BB-

操作の種類を選択する関数があります。

int SellOperation(double ToCompare)
  {
   int op;
   if (Bid> ToCompare)
     op=OP_SELLSTOP;
   if (Bid== ToCompare)
     op=OP_SELL;
   if (Bid< ToCompare)
     op=OP_SELLLIMIT;        
   return( op);   
  }
  
  
int BuyOperation(double ToCompare)
  { 
   int op;
   if (Ask> ToCompare)
     op=OP_BUYLIMIT;
   if (Ask== ToCompare)
     op=OP_BUY;
   if (Ask< ToCompare)
     op=OP_BUYSTOP;
   return( op);
  }

int WhatOperation(int operation, double ToCompare)
  { 
   if ( operation==OP_BUY)
     return( BuyOperation( ToCompare));
   if ( operation==OP_SELL)
     return( SellOperation( ToCompare));     
  }       

このような感じです。

09:28:46 2008.06.09 00:00 ForexCraft2 EURGBP,Daily。パイロン0@0.8024をレベル2で売り建てる一方、ビッド=0.8016を売り建てる。
09:28:46 2008.06.09 00:00 ForexCraft2 EURGBP,Daily。オーダーセンドエラー 130
09:28:46 2008.06.09 00:00 ForexCraft2 EURGBP,Daily。ReliableOrderSend error : 130 : 無効なストップです。


 

TheEconomist さん、こんにちは。

いくつか質問させてください。

1.WhatOperation()が実際に与えられたものをノルム化することが保証されていない限り、ToCompareにノーマライズを見ません。

2.2. ダブルコンペに問題がある - 例えば、'Conditional Statement failure...'( 1.4225 > 1.4225) が真でない場合!!!!!!!

3.https://book.mql4.com/appendix/limits のガイダンスに従っていますか?

回答

 

130の'Quick Question' のエラーを解決するために、この投稿を勉強しています。 注文送信機能も印刷機能付き仕訳もあるのですが、何が起こっているのかご存知の方はいらっしゃいますか?

ありがとうございました。

バウアーボーイ

 

.

as seen on .../24681

if( isBuying ) 
{ 
  if( stopLoss > 0)
  ACCTSL = Ask - ( stopLoss*Point* MyDig);

  if( takeProfit > 0)
  ACCTTP = Ask + ( takeProfit*Point* MyDig);
  // Buy
  ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, slippage, ACCTSL, ACCTTP, 
  nameEA, 16384,0,Red); 
  Print ("Stop Loss Value", ACCTSL);
  Print ("Take Profit Value", ACCTTP);

1.StopLevel= MarketInfo(Symbol(),MODE_STOPLEVEL);

SL,TPは Bidから StopLevel 以上離れて いる必要が あります。

下記参照 (**)


2.ACCTxx = NormalizeDouble(Ask ...(..),Digits)です。


3.Print("Bid=",DoubleToString(Ask,Digits),", Ask=",DoubleToString(Bid,Digits));


4.Print ("ストップロス値",DoubleToString( ACCTSL, Digits),", stopLoss=",stopLoss);
Print ("Take Profit Value", DoubleToString(ACCTTP,Digits),", takeProfit=",takeProfit);

なぜDoubleToString()なのか?Print()4桁しか 表示しない



Btw、私はまた、少なくとも 度はどこかに いると思います Print("MyDig=",MyDig); なぜ? まさか、あなたはそれを心配する必要があります。些細なことに思えるかもしれませんが、このような単純なものにまつわる面白さに驚くことでしょう。


5.5. 利用可能なすべての情報を手元に置き、それを表示 することによって、すべての問題を簡単に解決することができます。

そして、昔ながらの紙と鉛筆で どこに誤解があるのかを確認 することができます。



(**)

参考:https://book.mql4.com/appendix/limits

StopLevel 最小距離の制限。

以下の条件のいずれかが崩れた場合、取引操作は実行されません。

注文の種類 建値 ストップロス(SL) テイクプロフィット(TP)
買い
変更禁止 ビッド-SL≥ストップレベル TP-ビッド≥ストップレベル
売り
変更禁止 SL-Ask StopLevel アスク-TP ストップレベル
買いの制限
Ask-OpenPrice StopLevel OpenPrice-SL StopLevel TP-OpenPrice(オープンプライス) StopLevel(ストップレベル
売りのリミット
オープンプライス-ビッド≥ストップレベル SL-OpenPrice≧StopLevel。 OpenPrice-TP StopLevel
買いストップ
OpenPrice-Ask StopLevel OpenPrice-SL ≥ StopLevel TP-OpenPrice(オープンプライス)≥ StopLevel(ストップレベル
売りストップ
買値-売値≥ストップレベル SL-OpenPrice StopLevel OpenPrice-TP StopLevel

 
fbj wrote>>

.

as seen on .../24681

1.StopLevel= MarketInfo(Symbol(),MODE_STOPLEVEL);

SL,TPは Bidから StopLevel 以上離れて いる必要が あります。

下記参照 (**)


2.ACCTxx = NormalizeDouble(Ask ...(..),Digits);


3.Print("Bid=",DoubleToString(Ask,Digits),", Ask=",DoubleToString(Bid,Digits));


4.Print ("ストップロス値",DoubleToString( ACCTSL, Digits),", stopLoss=",stopLoss);
Print ("Take Profit Value", DoubleToString(ACCTTP,Digits),", takeProfit=",takeProfit);

なぜDoubleToString()なのか?Print()4桁しか 表示しない



Btw、私はまた、少なくとも 度はどこかに いると思います Print("MyDig=",MyDig); なぜ? まさか、あなたはそれを心配する必要があります。些細なことかもしれませんが、このような単純なものにまつわる面白さに驚くことでしょう!


5.すべての利用可能な情報を手元に置いて、それを表示 することによって、すべてのあなたの問題は簡単に解決することができます。

そして、昔ながらの紙と鉛筆で どこに誤解があるのかを確認 することができます。



(**)

参考:https://book.mql4.com/appendix/limits

StopLevel 最小距離の制限。

以下の条件のいずれかが崩れた場合、取引操作は実行されません。

注文の種類 建値 ストップロス(SL) テイクプロフィット(TP)
買い
変更禁止 ビッド-SL≥ストップレベル TP-ビッド≥ストップレベル
売り
変更禁止 SL-Ask StopLevel アスク-TP ストップレベル
買いの制限
Ask-OpenPrice StopLevel OpenPrice-SL StopLevel TP-OpenPrice(オープンプライス) StopLevel(ストップレベル
売りのリミット
オープンプライス-ビッド≥ストップレベル SL-OpenPrice≧StopLevel。 OpenPrice-TP StopLevel
買いストップ
OpenPrice-Ask StopLevel OpenPrice-SL ≥ StopLevel TP-OpenPrice(オープンプライス)≥ StopLevel(ストップレベル
売りストップ
買値-売値≥ストップレベル SL-OpenPrice StopLevel OpenPrice-TP StopLevel

何がどうなっているのか、なぜこうなっているのか、本当にわからない。

2009.08.05 14:32:26 Trender Beta Test EURUSD,H1: OrderSend (Trender Beta Test ) failed with error #130

2009.08.05 14:32:26 トレンダー・ベータテスト EURUSD,H1: MyDig=10

2009.08.05 14:32:26 トレンダーベータテスト EURUSD,H1: テイクプロフィット Value1.43155, takeProfit=110

2009.08.05 14:32:26 トレンダーベータテスト EURUSD,H1: ストップロス Value1.42255, stopLoss=200

2009.08.05 14:32:26 トレンダーベータテスト EURUSD,H1: Bid=1.44255、Ask=1.44229







 
Bauer_Boy wrote>>

何が起こっているのか、なぜこのようなことが起こっているのか、本当にわからない

本当にコード全体を表示する時間です。もし、躊躇するならば、PMを使うことができます。

私はあなたがTPがその後入札より低い持っている参照してください