Trailingstop EAが動作しない。 - ページ 3

 
FMIC: アドバイスとしては、"Ask "や "Bid "を使用せず、"OrderClosePrice() "を使用することです。これは、買いまたは売りの注文に関係なく、リアルタイムの値です。
リアルタイムではありません。
  1. AskBid については、複数のサーバー呼び出しの間、スリープ または長時間の計算の後など、遅延の後にRefreshRates() を 実行する必要があります。
  2. OrderClosePriceではOrderSelectの ときのみ更新 されます。したがって、スリープや長い計算の後(またはOnTick 呼び出しの間に注文を選択したまま)、再選択する必要があります。
    OrderSelect(OrderTicket(), SELECT_BY_TICKET); // Refresh OrderClosePrice
 
WHRoeder:
リアルタイムではありません。
  1. Askと Bidでは、複数のサーバー呼び出しの間、Sleepや 長い計算の後など、遅延が発生した後にRefreshRates()を 実行する必要があります。
  2. OrderClosePriceではOrderSelectが 行われた場合のみ更新 されます。したがって、スリープや長い計算の後(またはOnTick コールの間に注文を選択したまま)、再選択する必要があります。

情報をありがとうございました。OrderClosePrice()」がバッファリングされることは知りませんでした。ですから、"OrderClosePrice()" も "Ask" / "Bid" も理想的なリアルタイムソリューションではないのでしょうね。

しかし、"OrderSelect() "を行った後に "Ask"/"Bid "を使用するよりも、"OrderClosePrice() "が全体的に良い解決策であることに同意しますか?

また、Real-timeソリューションが本当に必要であれば、代替案で対応できるのではないでしょうか。

  • OrderSelect()」による注文の再選択(EDIT: ご指摘いただいたのに、最初の投稿にこれを記載するのを忘れていました。)
  • "RefreshRate() "で "Ask"/"Bid "を指定する
  • "MarketInfo()" で "MODE_ASK"/"MODE_BID" (古いMQL4スタイル)
  • "SymbolInfoDouble() "で "SYMBOL_ASK"/"SYMBOL_BID"(新スタイルのMQL4+とMQL5)
  • "SymbolInfoTick()"(これはとにかく私のEAのほとんどですでに使っています。)
 
FMIC: しかし、"OrderSelect() "を行った後に "Ask"/"Bid "を使用するよりも、"OrderClosePrice() "が全体的に良い解決策であることに同意しますか?
は絶対です。
 

なぜ、また車輪を発明しようとするのですか?

ここを 見れば、必要なものはすべて見つかるはずです。

そうでない場合は、ソースコードを修正することから始めましょう。

 

今までありがとうございました。 エラー130の問題は解決したと思いますが、私のOrderSelect関数に 深刻な問題があり、そのため時々一部の注文しか修正されない可能性が高いです。 以下は私が印刷したリストです。OrderTicket # が完全に間違っています。 このチケット番号は、私が EURAUD で開いているトレードに属しています。 すべての結果を含んでいませんが、OrderTicket 番号がトレードターミナルのペアと一致しないペアが実際に複数あります。

どなたか見ていただいて、OrderSelectの何が問題なのかを教えていただけないでしょうか?ありがとうございます。

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: ticket = 0 ticketはOrdersTotalと同じ値を出力するはずなので、私のカウンターが機能しないようです。

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15:OrderSelect = true

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrdersTotal = 11

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbypos = 0

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbyticket = 1

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: OrderTicket = 50213357

extern int TrailingStart=12;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   int ticket=0;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+2;
   
   Print("OrdersTotal = ",OrdersTotal());
   Print("OrderSelect = ",OrderSelect(OrderTicket(),SELECT_BY_TICKET));
   Print("ticket = ",ticket);                     
   Print("OrderTicket = ",OrderTicket());                     
   Print("Selectbyticket = ",SELECT_BY_TICKET);                     
   Print("Selectbypos = ",SELECT_BY_POS);                     
                        
   {for(int i=OrdersTotal()-1; i>=0; i--){ //I added more curly brackets{}
      if(OrderSelect(i,SELECT_BY_POS)){
      ticket++;{
         if(OrderSymbol()==_Symbol){
            if(OrderType()==OP_BUY){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){ //For now, I have changed back to Bid and Ask and will include OrderClosePrice() later on.
                     if(TrailingStop*Pip<Bid-(TrailingStop*Pip)){ //I have added TrailingStop*Pip before the '<'
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue)) //I removed the !
                        return(0); //I replaced the Getlasterrror with a return value
                        RefreshRates();
                        }     
                    }  
                }     
            }  
            if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(TrailingStop*Pip>Ask+(TrailingStop*Pip)){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        return(0);
                        RefreshRates();
                       }
                    }
                }  
            }
         }
      } 
   }
}  
  return(0);
}
//+------------------------------------------------------------------+



 

皆さんこんにちは、いつもありがとうございます。 間違いを発見し、問題が解決しました。買い注文を修正する場合、0は常にBid-TrailingStop*Pipより小さいので、これは問題ではありません。 しかし、売り注文では 0は決してAsk+Trailingstop*Pip以上にはなりません。 そこで私はこの行にor( || OrderStopLoss() )を追加しなければならなかったのです。

if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){ //Added OrderStopLoss()==0
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
 
Trader3000 そのチケット番号は、私がEURAUDのために開いている取引に属しています。
OrderSelect ループでフィルタリングを行わない。別のチャートに別の通貨を追加した場合、シンボルがOrderymbolと一致しない。-MQL4フォーラム
 
WHRoeder:
Trader3000: そのチケット番号は、私がEURAUDのために開いている取引に属しています。
OrderSelect ループでフィルタリングを行わない。別のチャートに別の通貨を追加した場合、シンボルがOrderymbolと一致しない。- MQL4フォーラム

どうもありがとうございます。 はい、確かにOrderSelectは一部のチャートでしか動作しないので問題があります。 もう一つの問題は、取引が手動で行われるため、MagicNumberを含めることができません。 関連すると思われる部分を使用しましたが、コンパイルできません。 このエラーが表示されます。

'MySelect' - function can be declared only in the global scope Trailing_v26.mq4 31 13

で、31行目がこれです。

bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){

以下は、EA全体です。

#property strict;
extern int TrailingStart=10;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
      MessageBox("Please note: Your inputs for TrailingStart and/or TrailingStop cannot"+
                 "\nbe less than the minimum levels required by your broker and the"+
                 "\nTrailingStart has been increased automatically to "+StringConcatenate(stoplevel+TrailingStop)+" pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop;
           
    bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
    if (!OrderSelect(iWhat, eSelect, ePool))     return (false);
    if (OrderSymbol()      != _Symbol)           return (false);
    if (ePool != MODE_HISTORY)                   return (true);
    return(OrderType() <= OP_SELL);
}
    for(int i = OrdersTotal()-1; i >= 0; i--)
    if (MySelect(i, SELECT_BY_POS)){

    for(int iPos=OrdersHistoryTotal()-1; iPos >= 0; iPos--)
    if (MySelect(iPos, SELECT_BY_POS, MODE_HISTORY)){
        int nextTkt = OrderTicket();
     
              if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){
                     if(OrderStopLoss()<Bid-(TrailingStop*Pip)){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue))
                        Print("Buy = ",GetLastError());
                        return(0);
                        RefreshRates();
                        }     
                     }  
                  }     
               }
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        Print("Sell = ",GetLastError());
                        return(0);
                        RefreshRates();
                        }
                     }
                  }  
               }
            
         
         
  return(0);
}
//+------------------------------------------------------------------+



 
Trader3000:

はい、確かにOrderSelectは一部のチャートでしか動作しないので問題があります。 もう一つの問題は、取引が手動で行われるため、MagicNumberを含めることができません。 関連すると思われるコードの部分を使用しましたが、コンパイルすることができません。

私はあなたに、あなたの問題を解決するための完璧なスケルトンコードを提供し、さらにその前にそれらをリストアップしましたが、あなたはそれを無視することを選び、なぜあなたのコードがあなたの望むことをしないのかと悩み続けています。

なぜでしょうか?あなたは自分のコードが動作しないことを望んでいるのでしょうか?例題を使って、自分でテストしてみてください

 
彼はカットアンドペーストで済むと思っていて、コードを学ぶ必要がないのです。こんな簡単なエラーも聞かないと直せないらしい。
'MySelect' - function can be declared only in the global scope Trailing_v26.mq4 31 13