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

 
WHRoeder:
彼はカット&ペーストすればいいと思っていて、コードを学ぶ必要はない。この簡単なエラーも聞かないと直せないそうです。
'MySelect' - function can be declared only in the global scope Trailing_v26.mq4 31 13


あなたや他の皆さんが提供しているヘルプに本当に感謝しています。 私はそれをコンパイルするために、ここ数日間あらゆることを試してきましたが、聞かなかったことをお詫びします。 ほとんどの皆さんが、自分のコードを使うのを延期して他の人のコードを使うことを提案していますが、私は自分が間違っていることを理解しないなら、学ぶつもりはありません。私のコードは、ポジションごとに注文を数え、私の基準を満たすものだけを選択し、その特定の取引を修正するよう求めています。 これまでのところ、4ページにわたって、誰も私のコードのどの行が壊れているのかを指摘していません。私の今のゴールは、動くトレーリングストップEAを作ることではありません。実は、私のコードはJimdandyがYoutubeのTrailingstopsに関するチュートリアルに投稿したコードとほぼ同じでした。 彼とほぼ同じなので、私はコードをほぼそのままコピーしましたが(私が手動でトレードしたいことを除いて)、彼のコードも同様に時々しか動きません。

このトレードはTrailingstopが働くと指定したポイント(150ポイントでした)を300ポイント近く超えています。

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderModify = false

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Ask = 1.45926

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Selectbypos = 0

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Selectbyticket = 1

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderTicket = 50381828

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: チケット = 0

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderSelect = true(オーダーセレクト = true)

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrdersTotal = 16

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderSymbol = EURUSD

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderTicket = 50381828

2016.04.22 00:17:58.934 Trailing_v33 EURAUD,M15:OrderModify = false

このEAはEURAUDにのみ置かれています。 他の9つのチャートでは16のOrderが開かれています。 このペアで選択されたチケット番号は完全に間違っており、OrderSymbolも完全に間違っています。 どちらもEURUSDの注文です。 上記のことから、この場合、forループはポジション 0を選択して いますが、EURAUDはポジション14 (15-1) で選択すべきでした。 なぜ? これを無視しろと言ったのです。

上記のビデオでジムは実際にこの問題に取り組んでいて、私の問題を克服するために以下のコードを使用していると言っています。 しかし、これは注文を適切に送信するためのカウンターであり、注文をフィルタリングする機能ではありません。 私はこれをフィルタとして使用しようとしましたが、成功しませんでした。

int OpenOrdersThisPair(string pair){
   int total=0;
      for(int s= OrdersTotal()-1; s>= 0; s--){
         OrderSelect(s,SELECT_BY_POS,MODE_TRADES);
           if(OrderSymbol()==pair) total++;
       }
   return(total);  
}

どなたか、私のコードを批評して、ここから学べるようにしてください。時々完璧に動作するので、それほど悪いものではないことは分かっています。 ありがとうございます。

#property strict;
extern string Label_TrailingStart="Pip threshold to activate TrailingStop";
extern int TrailingStart=10;
extern string Label_TrailingStop="Pips trailing behind";
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10,Pip=Point*10;
int TS=TrailingStart-TrailingStop;
bool UseTrailingStop=true,UseAutotrading=true;
//+------------------------------------------------------------------+
//|  Expert initialization function                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
    MessageBox("Please note: Your inputs cannot be less than the minimum levels required"+
            "\nby your broker. Please reload the EA and either increase the value of the"+
            "\nTrailingStart and/or decrease the value of the TrailingStop so that "+
            "\nTrailingStart-TrailingStop >= "+StringConcatenate(stoplevel)+" pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|    Expert deinitialization function                              |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|   Expert start function                                          |
//+------------------------------------------------------------------+
int start(){
   if(UseTrailingStop) Trailing(); 
   if(UseAutotrading) Autotrading();  
   return(0);
}
//+------------------------------------------------------------------+
void Trailing(){
for(int b=OrdersTotal()-1; b>=0; b--){
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol())
            if(OrderType()==OP_BUY)
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip))
                     if(OrderStopLoss()<Bid-(TrailingStop*Pip))
                        OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue);
   }     
   for(int s=OrdersTotal()-1; s>=0; s--){
     if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol())
            if(OrderType()==OP_SELL)
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip))
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0)
                        OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red);
   }
}
void Autotrading(){
   if(!IsTradeAllowed()){
      MessageBox("This Expert Advisor requires Auto Trading. Please reload the EA or right click on"+
                 "\nthe chart to bring up the inputs window. Under the common tab check the box to"+
                 "\nallow live trading");
      Sleep(50000);
     }
   if(!IsExpertEnabled()){
      MessageBox("This Expert Advisor requires Auto Trading. Please click the button at the top");
      Sleep(50000);
     } 
}


 
Trader3000:

これまでのところ、4ページにわたって誰も私のコードのどの行が壊れているのかを指摘していません。

そんなことはありません!私たちはあなたのエラーを説明し、それに対する解決策を様々な形や選択肢で提示してきました。しかし、あなたはそれを無視し、自分のやり方でやり続けています。そればかりか、あなたはさらに間違いを増やして、さらに悪化させています。

画家が絵を描くことを学ぶとき、彼はまずそれをマスターした他の人たちの技術を真似ることから始めます。そして、その技術に慣れてきたところで、初めて「自分の絵の描き方」を作り始めるのです。

ここで、「私の批評」の短いリストを紹介します。

  1. 中括弧(「カール」ブラケット)を使いなさい。中括弧を省略したり、節約しようとしないでください。あなたのコードが完全に機能 し、デバッグされるまで、たとえブロックに含まれる1行のためだけであっても、それらを追加してください。その場合も、別の行に記述してください。空白がたくさんあっても気にしないでください。しかし、最初のうちは、すべてが正しいコードブロックに収まっているか、中括弧と括弧のバランスが取れているかを確認する必要があります。特にこのコンパイラのような気難しいコンパイラでは、デバッグが非常に難しくなるので、「if」文をいくつも並べることは災いのもとです。
  2. 元のコードでは1つしかなかったループを2つにしたのは、コードをさらに遅くし、バグがあったときに修正しなければならない場所を繰り返すため以外の明白な理由はありません。
  3. 式の結果を格納するために変数を使用してください。同じ式を何度も繰り返すので、コードが遅くなるだけでなく、エラーが発生しやすくなり、何箇所も変更しなければならないので、読んだり修正したりするのがより困難になります。

他にもいろいろありますが、最低限これだけは直してください。

コーディングは、他の言語と同じです。たしかに単語を並べるだけならできますが、それだけでは詩人にはなれません。コーディングでは、読みやすく機能的なものにするために、リズムや構造も必要なのです。

 
FMIC:

以下は、「私の批評」の短いリストです。

OK ありがとうございます!実は、以前ここに投稿したコードのように、最初はすべての「if」文に括弧をつけていたのですが、そのコードがうまくいかなかったので、前の投稿に貼り付けたコードをコピーするなど、いろいろ試してみました。これは私のコードでもないのですが、すべてのペアで動作するわけでもないので、もう一度括弧を置き換えて他のアドバイスに従います。 とりあえず、OrderSelectはEAが乗っているオーダーではなく、最初のオーダーのSymbolをターミナルに表示することを知ったので、実は間違ってはいなかったんです。

EDIT: 提案3番ありがとうございます!!これが問題だったと思います。 なぜなら、OrderはまずSymbolで選択され、次にその値が保存されなければならないからです。 そこで、変数を以下のようにこれらの関数の 下に移動させ、今はうまくいくようです(ただし、確実に知るにはもっとテストが必要です

int start(){
      for(int i=OrdersTotal()-1; i>=0; i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderSymbol()!= Symbol()) continue;
               double Pip=Point*10,TSTP=TrailingStart*Pip,Trail=TrailingStop*Pip,SL=StopLoss*Pip;               
                  if(OrderType()==OP_BUY){
                     if(Bid-OrderOpenPrice()>TSTP){
                        if(OrderStopLoss()<Bid-Trail){
                           if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Trail,OrderTakeProfit(),Orange))
                              Print("Error Buy TrailingStop: ",GetLastError());
            }
         }
 
Trader3000:

私は、以前ここに投稿したコードのように、最初はすべての'if'ステートメントにブラケットを持っていましたが、そのコードが動作しないので、私は前の投稿に貼り付けたコードをコピーするなど、他の様々なことを試してみました。これは私のコードでもないのですが、すべてのペアで動作するわけでもないので、もう一度括弧を置き換えて他のアドバイスに従います。 とりあえず、OrderSelectはEAが乗っているオーダーではなく、最初のオーダーのSymbolをターミナルに表示することを知ったので、実は間違ってはいなかったんです。

EDIT: 提案3番ありがとうございます!!これが問題だったと思います。 なぜなら、OrderはまずSymbolで選択され、次にその値が保存されなければならないからです。 そこで、変数を以下のようにこれらの関数の下に移動させ、今はうまくいくようです(ただし、確実に知るにはもっとテストが必要です

あなたの最新のコードを見て、私はこう言いたい -私はあきらめます!(あなたはフォロースルーを拒否しています)!
 
FMIC: あなたの最新のコードを見て、私はこれを言わなければならない -私はあきらめます!(あなたはフォロースルーを拒否しています)!
さて、皆さんは、彼らが皆の時間を無駄にすることに対して、私の「厳しい批判」を理解することができるかもしれません。私は、彼らが皆の時間を浪費することを許容すると考える「単純なこと」を 理解していますが、私はそう ではありません。

Trader3000: これが問題だったのだと思います、、、。
int start(){
      for(int i=OrdersTotal()-1; i>=0; i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderSymbol()!= Symbol()) continue;
               double Pip=Point*10, TSTP=TrailingStart*Pip, Trail=TrailingStop*Pip, SL=StopLoss*Pip;
                  if(OrderType()==OP_BUY){
                     if(Bid-OrderOpenPrice()>TSTP){
                        if(OrderStopLoss()<Bid-Trail){
                           if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Trail, OrderTakeProfit(), Orange))
                              Print("Error Buy TrailingStop: ",GetLastError());
            }
         }
あなたの問題は、あなたが考えていないことです。
int start(){
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()!= Symbol()) continue;
// Everything below is executed if NO order is selected or a selected order is symbol
      double Pip=Point*10, TSTP=TrailingStart*Pip, Trail=TrailingStop*Pip,SL=StopLoss*Pip;
      if(OrderType()==OP_BUY)
      && Bid-OrderOpenPrice()>TSTP)
      && OrderStopLoss()<Bid-Trail){
         if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid-Trail, OrderTakeProfit(), Orange))
            Print("Error Buy TrailingStop: ",GetLastError());
      }
   :
 
WHRoeder:
これで、私の「厳しい批判」もご理解いただけたでしょうか。私は、彼らが皆の時間を浪費することを許容すると考える「簡単なこと」は 理解できますが、そうではありません

そうなんです!残念ながら、その通りのようです!

 

このようにすると、stoplevelが50ポイントのすべてのペアで完全に動作しているようですが、外部変数がstoplevelよりも高い場合でも、EURAUDなどstoplevelがより高いペアでは動作しません。 だからこれは奇妙です。

extern int TrailingStart=15;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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;
           
   if(!IsTradeAllowed()){
      MessageBox("This Expert Advisor requires Auto Trading. Please reload the EA or right click on"+
                 "\nthe chart to bring up the inputs window. Under the common tab check the box to"+
                 "\nallow live trading");
      Sleep(50000);
     }
   if(!IsExpertEnabled()){
      MessageBox("This Expert Advisor requires Auto Trading. Please click the button at the top");
      Sleep(50000);
     } 
   int ticket=0,buy_ticket=0,sell_ticket=0;  
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol()){
      ticket++;
      if(OrderType()==OP_BUY) buy_ticket=OrderTicket();
      if(OrderType()==OP_SELL) sell_ticket=OrderTicket();
      }
            if(OrderType()==OP_BUY){
               if(OrderSelect(buy_ticket,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(OrderType()==OP_SELL){
               if(OrderSelect(sell_ticket,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);
}
//+------------------------------------------------------------------+
 

また、私のコードと非常によく似た別のEAを見つけ、コードを比較しました。 私は主な違いを強調しました。

1.減算の代わりに加算

2.Point*10ではなく、全てPointで掛け算している。

3.彼はTrailingstopとTrailingstepを一緒に足し、それから1を引いてTrailingstepで注文を修正します。 もし私がこれを正しく理解するなら、Trailingstartは15ピップ(150ポイント)の移動後に起動されます。私のEAでは、価格は5ピップス遅れて、価格が再び下落してこの5ピップスレベルに達すると停止されます。 彼のEAでは、それは15ピップス後に起動されますが、それは遅れているピップスの量は19(15+5-1)であり、価格は停止するために19ピップス下落する必要があります。例として、OrderOpenPriceが1.50000の場合、価格は150ポイント上昇し1.50150となりトレーリングストップが作動します。 その後価格が1.50100まで下がると、5ピップの利益でストップアウトされます。彼のEAでは、トレーリングストップは1.50150で作動しますが、トレールは1.49960にあり、ストップがストプレベルに近いのでエラー130に なると思います。 それとも私はこれを誤解しているのでしょうか?

私の問題は、これらのうちの1つまたは複数にある可能性がありますか?

//+------------------------------------------------------------------+
//|                                                   e-Trailing.mq4 |
//|                                           Êèì Èãîðü Â. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//| 12.09.2005 Àâòîìàòè÷åñêèé Trailing Stop âñåõ îòêðûòûõ ïîçèöèé    |
//|            Âåøàòü òîëüêî íà îäèí ãðàôèê                          |
//+------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV"
#property link      "http://www.kimiv.ru"

//------- Âíåøíèå ïàðàìåòðû ------------------------------------------
extern bool   ProfitTrailing = True;  // Òðàëèòü òîëüêî ïðîôèò
extern int    TrailingStop   = 15;     // Ôèêñèðîâàííûé ðàçìåð òðàëà
extern int    TrailingStep   = 5;     // Øàã òðàëà
extern bool   UseSound       = True;  // Èñïîëüçîâàòü çâóêîâîé ñèãíàë
extern string NameFileSound  = "expert.wav";  // Íàèìåíîâàíèå çâóêîâîãî ôàéëà

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start() {
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      TrailingPositions();
    }
  }
}

//+------------------------------------------------------------------+
//| Ñîïðîâîæäåíèå ïîçèöèè ïðîñòûì òðàëîì                             |
//+------------------------------------------------------------------+
void TrailingPositions() {
  double pBid, pAsk, pp;

  pp = MarketInfo(OrderSymbol(), MODE_POINT);
  if (OrderType()==OP_BUY) {
    pBid = MarketInfo(OrderSymbol(), MODE_BID);
    if (!ProfitTrailing || (pBid-OrderOpenPrice())>TrailingStop*pp) {
      if (OrderStopLoss()<pBid-(TrailingStop+TrailingStep-1)*pp) {
        ModifyStopLoss(pBid-TrailingStop*pp);
        return;
      }
    }
  }
  if (OrderType()==OP_SELL) {
    pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
    if (!ProfitTrailing || OrderOpenPrice()-pAsk>TrailingStop*pp) {
      if (OrderStopLoss()>pAsk+(TrailingStop+TrailingStep-1)*pp || OrderStopLoss()==0) {
        ModifyStopLoss(pAsk+TrailingStop*pp);
        return;
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Ïåðåíîñ óðîâíÿ StopLoss                                          |
//| Ïàðàìåòðû:                                                       |
//|   ldStopLoss - óðîâåíü StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;

  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm && UseSound) PlaySound(NameFileSound);
}
//+------------------------------------------------------------------+
 
Trader3000:

また、私のコードと非常に似たコードを持つ別のEAを見つけ、コードを比較しました。

あなたのこの論理を理解できるかどうか見てみましょう。あなたは、他の人のEAをどこからか見つけてきて、そのコードをあなたのEAに取り込もうとしていますが、あなたを助け、あなたの問題を修正するために特別に書かれたコードを取り込もうとはしていませんね!

ワオ!理にかなってる必要なときにスポックはどこにいるんだ

SPOCK、安らかに眠れ!私たちは皆、あなたがいなくて寂しいです

 
FMIC:

あなたの論理を理解できるかどうか見てみましょう。あなたは、どこからか他の人のEAを見つけてきて、そのコードを自分のものに取り込もうとしていますが、自分を助け、問題を修正するために特別に書かれたコードを取る気はないようですね。

ワオ!理にかなってる必要なときにスポックはどこにいるんだ

SPOCK、安らかに眠れ!私たちは皆、あなたがいなくて寂しいです

やっとわかりました!皆さん、ありがとうございました。 マイクが最初のページに載せてくれたコードを読み返してみて、私の間違いがわかりました。 あまりに微妙だったので見落としていたのかもしれませんが、ほとんどは私がコードのロジックを正しく理解していなかったためです。 問題は、TrailingStopのpip量が後ろに引きずるpip量だと考えていたことでした。そのため、gbpjpyのようなペアでは、15と5を入力したため、設定が基準値以下になっていました。 TrailingStopを増やすだけで、すべてのペアで機能するようになりました。 ありがとうございました!!!