[ARCHIVE!] フォーラムを散らかさないように、どんなルーキーの質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしではどこにも行けない - 4. - ページ 129

 
エラーの場所を教えてください - 見つかりません。
すでに注文修正コードを書き直したのですが、エラーは残ったままです。
私は、このエラーはログからではないことを強調します。
テストを実行中にResultsでエラーを発見しました。
例:
価格1.4654で買いポジション(注文番号1)を建てました
次に結果で修正(注文番号1)価格1.4654とTakeProfit 1.4752
次に結果で閉鎖(注文番号1)価格1.4704とTakeProfit 1.4752
利益 = 50.00

損切りポジション例ですがストップロスは設定していないので TakeProfitのみで閉鎖すべきですが、損切りのポジションと言えます。
私は1.4820
で買いポジション(注文番号271)をオープンし、結果には修正(注文番号271)価格1.4820とTakeProfit 1.4918
と書いてあり、結果にはクローズ(注文番号1)価格1.4737とTakeProfit 1.4918
利益 = - 83.46

と書いてある。

TakeProfitを100にしたのはどこでも同じです。

StopLossを設定しなかった。

どう直せばいいのかわからない。

このEAコードをコンパイルすると=エラー0件、警告0件。

このコードを使って、Modify Ordersを行いました。

//|  Описание : Модификация ордера. Версия функции для тестов на истории.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена открытия позиции, установки ордера                            |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0){
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
  double op=NormalizeDouble(OrderOpenPrice() , dg);
  double os=NormalizeDouble(OrderStopLoss()  , dg);
  double ot=NormalizeDouble(OrderTakeProfit(), dg);
  color  cl;

  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);

  if (pp!=op || sl!=os || tp!=ot) {
    if (MathMod(OrderType(), 2)==0) cl=clModifyBuy;
    if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
      er=GetLastError();
      Print("Error(",er,") modifying order: ",Error(error_code));
      Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
            " op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);
    }
  }
}
 
このEAはExcelのスプレッドシートで動作することを書き忘れました。
 
alex12:
エラーの場所を教えてください。
すでに注文修正コードを書き直したのですが、エラーは残ったままです。
私は、このエラーがログからのものではないことを強調します。
テスト中にResultsでエラーを発見しました。

1.4654で買いポジション(注文番号1)を建てました。
次に、Resultsにmodify (order number 1) price 1.4654 and TakeProfit 1.4752と書かれています。
次にResultsにclose(注文番号1) price 1.4704, TakeProfit 1.4752と書かれています。
利益=50.00

ストップロスを設定していないため、テイクプロフィットのみで決済する必要があるが、負けポジションの例。
1.4820で買いポジション(注文番号271)を建てました。
次にResultsにmodify(注文番号271) price 1.4820 and TakeProfit 1.4918と書かれています。
次に、結果にクローズ(注文番号1)価格1.4737、TakeProfit1.4918と書いてあります。
利益=-83.46

TakeProfitはどこでも100に設定しました。

StopLossを設定しなかった。

どう直せばいいのかわからない。

このEAコードをコンパイルすると=エラー0件、警告0件。

このコードを使って、Modify Ordersを行いました。

テスターで取引終了がこのように書かれている場合、orderclose関数の結果である可能性が高いです(TPやSLは関係ありません)。
 

の値を探すのを手伝ってください。

1 過去 X=5 間の最大日次変動率(日次高値-日次安値 .

2 過去 X=130日間の日次平均変動率

3 また、これらの値は、最大日次 変動 率がA=75B=150の 範囲にある場合、どのように条件に書き込むことができるのか- 平均日次変動率

double Dmax= 0.0; 
double DAvg= 0.0;
int a = 0; 
int d =d+1;  
while(a < 5) 
  { 
    Dmax = iHigh(Symbol(),PERIOD_D1,d)-iLow(Symbol(),PERIOD_D1,d); 
    a++; 
  } 
//Comment( "T ("+Dmax+")");

while(a < 130) 
   {  
 
DAvg += (iHigh(Symbol(),PERIOD_D1,d-1)-iLow(Symbol(),PERIOD_D1,d-1))/130; 
    a++; 
}
Comment( "T ("+DAvg+")");
 
sergeev:

1.まず、ウィンドウ(https://docs.mql4.com/ru/windows/WindowBarsPerChart)に必要なバーの本数を調べます。

2.そうすると、最初のバーhttps://docs.mql4.com/ru/windows/WindowFirstVisibleBar の日付が表示されます。

3.この最初のバーとバーの数を知っている - これらのバーを通過し、それらの間の高値と安値を決定します。

4. 利益


バリアント2

https://docs.mql4.com/ru/windows/WindowPriceMaxтво

https://docs.mql4.com/ru/windows/WindowPriceMinВторой バリアント

最初の選択肢に傾きましたが、ウィンドウ内のバーの数をどう計算すればいいのかわかりませんでした。 2番目の選択肢はもっと饒舌です。

しかし、どのように前のバーの最後の最大値と最小値を "キャッチ "するのですか? 事前にありがとうございます

 
MK07:


しかし、前のバーの最後の最大値と最小値を「キャッチ」するにはどうすればよいのでしょうか?

現在のバーで到達した最大値と最小値を記憶しておけばよく、新しいバーが現れて 前のバーとなったときに、記憶した変数から最大値と最小値を取ることになります。

 
sergeev:

現在のバーで到達した最大値と最小値を記憶しておけばよく、新しいバーが現れて前のバーとなったときに、記憶した変数から最大値と最小値を取ることになります。


でも、どうやって?変数Zに最大値を代入し、新しいバーが 現れたとします(それはチェックされるかもしれません)、Zはすぐに新しい値を代入され、一方、値(Z-1)は「失われた」。 おそらく、Zに新しい値を代入するときに何らかのチェックがあるはずです(新しいバーが現れるかもしれません)、私はあなたのプロ意識と忍耐を当てにしています!。お疲れ様でした。
 

zet変数をstaticとして宣言するか、グローバルゾーンに宣言します。

新しい値を割り当てる前に、新しいバーを 確認し、その値と現在の値との差を確認し、新しい値を割り当てる。

 
smshev:
テスターでトレードのクローズがリストアップされたように書かれている場合、orderclose関数の結果である可能性が高いです(TPやSLは 関係ありません)。

ありがとうございます。でも、コードに間違いはないようです。

int CloseOrder(int ticket, double lots)
              {
               int err,i1;
               double price;
               OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
               if (lots<MarketInfo(Symbol(),MODE_MINLOT))lots=MarketInfo(Symbol(),MODE_MINLOT);
               while(i1<10)
                   {
                    RefreshRates();
                    if (OrderType()==0)price=Bid;
                    if (OrderType()==1)price=Ask;
                    if (OrderType()>1){OrderDelete(ticket);return(0);}
                    OrderClose(ticket,lots,NormalizeDouble(price,Digits),Slippage,Goldenrod);
                    err = GetLastError();
                    if (err == 0) break;
                    Print(WindowExpertName(),Symbol(),Error(err),"  при закрытии ордера");
                    Sleep(100);
                    i1++;
                   }
               return(0);
              }
 

が、EAにはもう一つコードがあります。

int CloseMarket()
   {
    for (int j=0; j<OrdersTotal(); j++)
      {
       OrderSelect(j,SELECT_BY_POS,MODE_TRADES);
       if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()<2)
         {
          CloseOrder(OrderTicket(),OrderLots());
          j--;
         }
      }
   }