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

 
IgorM:

init()で複雑な計算や履歴の読み込みがあったり、ターミナルにたくさんのインジケーターやExpert Advisorがぶら下がっていたり...。

が、コードの初期化中に端末が割り込んでくると、ログに「......」というエラーが表示されます。タイムアウト

ターミナルでログを見てエラーがなければ、初期化が成功したことになります。 start()関数自体の確認は簡単で、最初の行に start(): Print("new tick") と書けばよいのです。


しました(((o(*゚▽゚*)o)))

int start()
  {
  Print("start");
  
/*current_values_from_MT(CUR, CUR_BUF);
current_values_from_MT(MAIN, MAIN_BUF);*/

  


   return(0);
  }

そう、多くの情報を揺さぶり、計算も、ダニの実験も...。

計算には2~3分かかり、MTは「ハングしない」、すべてが普通に動作し、Print() とAlertからのメッセージが表示され、その後すべてが表示される)

MTからのメッセージをすべて見てみましたが、エラーは見つかりませんでした...。

ご協力お願いします。

 
BBSL:

計算には2~3分かかり、MTは「ハング」せず、すべてが普通に動作し、Print()とAlertメッセージが表示され、その後すべてが表示されます))

Print()が出力されれば、start()は間違いなく動作しますが、計算が2-3分かかるという記述には困惑します。ターミナルにこのような負荷がかかる場合、関数sleep() を使って計算を中断しなければ、ターミナルは間違いなくハングアップします。

MT4にはデバッガがないので、怪しいコード部分にPrint()を挿入して、失敗したコード部分や失敗しなかった条件をキャッチします。

 
TakeProfitやStopLossによって未決済注文がトリガーされることを修正する必要があり、TakeProfitやStopLossの値は私には興味がない。
 
Jaguar1974:

注文がTakeProfitまたはStopLossによってトリガーされるかどうかを確認するにはどうすればよいですか?ご返信ありがとうございました

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по стопу.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, osl;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl) return(True);
  }
  return(False);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}
両方の関数のコードをよく理解し、実行速度と 特定のタスクのために最適化するためにそれらを1つに統合する...
 
eddy:
Sayod さんは、どのような時間枠で、どのようなパラメータで取引されていますか?


何が違うのか、あるいは逆にしていてテストしたいのか?

デフォルトでh1での取引。

ピップステップ - 30

ロットエキスポ - 1.59

アイデアが実装されていれば、パラメータはあまり関係ないと思います、Expert Advisorはどんなパラメータでも良いと思います、IMHO。

 
Jaguar1974:
TakeProfitまたはStopLossによってトリガーされたオープンオーダーの事実をコミットする必要があります。TakeProfitとStopLossの実際の値には興味がありません。

注文が発動した事実だけを登録したいのであれば、前のティックの注文 数を記憶し、次のティックの注文数と比較し、注文数が変化していれば、それは・・・ということです。
 
kiimar:
端末は「so:19.5%/28.4/145.8」というコメントとともに負け注文をクローズした。これはどういうことでしょうか?
自由証拠金の水準である19.5%に達した時点でストップアウトが発生し、負けトレードがルールに従って決済されたことを意味します。
 
IgorM:

Print()がプリントアウトした場合、確かにstart()は動作しています。しかし、計算に2-3分かかるという記述には困惑します。

MT4にはデバッガがないので、怪しいコード部分にPrint()を挿入して、失敗したコード部分や失敗しなかった条件をキャッチします。


すみません、勘違いしていました、Printは initの時のみ機能します。起動に入れない))

はい、各関数の最後に、それに関するメッセージと一緒にprintを置き、すべてがうまくいっているかどうかをチェックしました。 そして、すべてのメッセージ(すべての関数)は、initの終わりまで100%機能しましたが、スタートに行くことができません!(笑)。

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

 
ありがとうございます、まだまだ勉強不足です。
artmedia70:
両方の関数のコードをよく理解し、実行速度と特定のタスクのために最適化するためにそれらを1つに統合する...
 
BBSL:


すみません、言い間違えました、Printはiniteでしか使えません。スタートに入れない))

はい、各関数の終わりに、それに関するメッセージのプリントを挿入して、すべてがうまくいっているかどうかをチェックします。 そして、すべてのメッセージ(すべての関数)は、initの終わりまで100%動作していますが、スタートに行くことができません!(笑)。

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

率直に言って、端末に刻みがないわけです。つまり、接続されていないか、オフラインのチャートで作業しているか、initでIsExpertEnabled() を確認し、許可されていなければEAを有効にしてください。