[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 271

 
hoz:

そこにあるものは理解できる。しかし、なぜこのような実装になっているのか、その理由は明らかではありません。

個々のライブラリ関数は全体の一部であり、個々のライブラリは私のライブラリの複合体全体の一部である-この認識なしに、コードを理解することは不可能である。

ホズ

どうせ、ライブラリはそのままでは使えない、つまり、そこにすべてを縛り付けているわけですから。他人のパックであらゆる機能を...

そして、そこが間違いなのです。平均的な」EAの構造について考えたことがありますか?EAの個性はストラテジー条件(エントリー/エグジット条件)であり、それ以外はすべて標準的なコードです。注文に基づくEAも含めて、私がEAを作成する方法は、テンプレート(例えば、ネットワークEAが必要な場合はSAR)を取り、それに新しい戦略の条件が書かれた追加のライブラリを接続します(私はそれを再作成します)。

ホズ

どうしても確認したかったわけではありません。さらに言えば、すべてが非常に有能に書かれていることは間違いない。ただ、私はすべてを理解できているわけではないので、「そうは思わない」と言ったのです。私は見て、私は考えて...でも、すべてを理解しているわけではありません。だから聞いたんです。

P.S. bs_Symbolで、私はまだそれを得ることができません。

実装を理解するためには、ソースデータを理解する必要があります。このライブラリは、あらゆる金融商品(FX)、単通貨と多通貨の両方のモードで動作するように作成されており、そのため、現在の金融商品の値を格納するグローバル変数 bs_Symbolを導入しています。
 
IIya:

友よ! EAの微調整を手伝ってほしい。

ある条件下で注文を開くコードがあります。int start() のボディに配置されているため、条件の実行は毎ティック行うことができる。

必要です。

1.条件実行(および注文の開始)後、新規注文の開始のためn 小節間休止する。例えば、EAがタイムフレームM30にあり、3時間休止する必要がある場合、休止は6本であるべきです。

2.このプログラムはストラテジーテスターで動作するはずです。

どのようなコードが必要ですか?そして、それを置く場所には何がふさわしいか。

iBarShift()関数を使用すると便利です。まず、最後の注文の開始時刻を調べてこの関数に渡し、この関数が返す値をある数値(あなたの場合は6)と比較して監視する必要があります。
 
TarasBY:
iBarShift()という関数が役に立ちます。まず、最後の注文の開始時刻を調べてこの関数に渡し、この関数が返す値をある数値(あなたの場合は6)と比較して監視する必要があります。

一緒に解決していきましょう )

この関数に最後に注文を開始した時刻を渡し、返された番号を取得する。これはおよそ

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
int my_bar = iBarShift(NULL,PERIOD_M30,OrderOpenTime()); 

OK......バー・ナンバーがわかったよ。さて、6本のバーのオープンオーダーを一時停止するにはどうすればよいのでしょうか。

 
IIya:

一緒に解決していきましょう )

最後に注文を開始した時刻を関数に渡し、返される数値がおおよそであることを取得します。

OK......バー・ナンバーがわかったよ。さて、6本のバーのオープンオーダーを一時停止するにはどうすればよいのでしょうか。

これは無教養なやり方です。

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);

ただ、今回の件とは直接関係ないので、重視しないだけです。スキームは次のようなものです。

    if (my_bar >= 6)
    {
        OrderSend();
    }
 
TarasBY:
ロジックに明らかな誤りはない。コードを段階的に印刷します。取引手順は、チケット変数の値に連動しています。まず、その変化をトレースする。また、グローバル変数 "TRADECONTEXT "の値に注意してください - その値は0でなければなりません。

ありがとうございました。ただ、何もわからない(((;゚Д゚)))このコードでは盲目の子猫のようだ(((;゚Д゚)))ガクガクブルブル
 
al7bar:

ありがとうございました。しかし、私は何も理解していません((( 私はこのコードでは盲目の子猫のようなものです((....
このコードの作者はあなたではないことが判明しました。そうすれば、作者にコンタクトを取りやすくなります。
 
TarasBY:

個々のライブラリ関数は全体の一部であり、個々のライブラリは私のライブラリの複合体全体の一部である-この認識なくして、コードを理解することは不可能である。

理解しようとすると、いろいろなニュアンスにぶつかるんです。だから、あなたが一番よく知っているあなたに聞いているのです。あなたは著者です...

TarasBY:

そして、そこが間違いなのです。平均的な」Expert Advisorの構造について考えたことがありますか?ストラテジー条件(エントリー/エグジット条件)がEAの個性を作り、それ以外は標準的なコードとなります。Expert Advisor の作成方法は、注文に基づくものも含めて、テンプレート(例えば、ネットワーク EA が必要な場合は SAR)を使用し、新しいストラテジー条件を書き込む追加ライブラリに接続します(再作成します)。

それはわかります。ただ、ライブラリごとコピーするのは嫌なんです。個人で仕事をするのに便利な土台を作った方がいいということは理解しているはずです。

TarasBY:

実装を理解するためには、初期データを理解する必要があります。このライブラリは、どのツール(FX)でも、またモノラルでもマルチカレンシーモードでも動作するように作成されています。そのため、現在のシンボルの値を格納するグローバル変数bs_Symbolが導入されています。

また、この変数はシークレットでない場合、どこで明示的に設定されるのでしょうか?:)ライブラリb-PSI@Base.mqh を見ると、宣言されているだけなんですね。

 bs_Symbol,                            // текущий инструмент

しかし、実際にはそれ以上のものはない。いずれにせよ、現在のツールの値は、デフォルトでSymbol() を通して返されます。では、なぜここで変数が必要なのでしょうか?

 
TarasBY:

これは無教養なやり方です。

ただ、今回の件とは直接関係ないため、重視していないだけです。そして、その模様はこんな感じです。

これで、私たちのコードは動作するようになりました。私のバージョンでは、次のように動作します。
int start()
  {
   if (OrdersTotal()<1)                                                //условие
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
      }
   OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
   int my_bar = iBarShift(NULL,PERIOD_M30,OrderOpenTime()); 
   if (my_bar > 6)                                                     //если прошло 6 баров с момента открытия последнего ордера
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);      //открываем новый ордер
      }
   return(0);
  }

:)しかし、現在のようにExpert Advisorに導入すると、すべてが正しく動作しなくなります。

私が理解する限り、このエントリーによるものです。

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);

どうしたんですか?

 
こんにちは、みんな。トランザクションの開口部でロットを増加させるスクリプトを作成することができますすべての人に応答してください。
 
IIya:
これで、私たちのコードは動作するようになりました。私のバージョンでは、次のように動作します。

:)ただし、今のままEAに実装すると、すべてが不正に動作するようになります。

このエントリーがあったからこそ理解できた。

どうしたんですか?

私はスキームを描いただけで、それ以上のロジックを考えるのはあなたの仕事です。

int start()
{
   if (OrdersTotal()<1)                                                //условие
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
      }
   else
   {
       OrderSelect (OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
       int my_bar = iBarShift (NULL,PERIOD_M30,OrderOpenTime()); 
       if (my_bar >= 6)                                                     //если прошло 6 баров с момента открытия ордера
       {OrderSend (Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);}      //открываем новый ордер
   }
   return(0);
}