[警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 - ページ 567

 
Catrock писал(а)>>

またまた初心者からの質問です。

Expert Advisor では、いくつかのユーザー定義関数を使用しています。これらの関数をライブラリにまとめて、Expert Advisor 本体でそこから呼び出すようにするには、どうすればよいでしょうか。

この点については、私は言語の構文に詳しくないのです。

ドキュメントやチュートリアルのセクションを参照してください。そこでは見つかっていないんです。


https://book.mql4.com/ru/build/structure

https://www.mql5.com/ru/articles/1462

+ 最後に...https://book.mql4.com/ru/appendix/examples

 

ゼロバーでオープンポジションがあるか、あった かをチェックする関数の書き方(できれば時間枠の選択も。OpenPosLastBar(string sym="", int tf=0, int op=-1, int mn=-1)、またはこの関数がそうします。私の理解では、現時点ではポジションを開くだけですが、開いていて既に閉じている場合は-1を返します。

//+-----------------------------------------------------------------------------
//| 最後に開いたポジションのバー番号または-1を返します。|
//| パラメータ。|
//| sym - 楽器名 ("" - 現在のシンボル ) |
//| tf - 時間枠 ( 0 - 現在の時間枠 ) |
//| op - 操作 (-1 - 任意の位置 ) |
//| mn - MagicNumber (-1 - 任意のマジック ) |
//+--------------------------------------------------------+
int NumberOfBarLastPos(string sym=")", int tf=0, int op=-1, int mn=-1)
{
datetime oot;
int i, k=OrdersTotal();

if(sym==")
sym=Symbol();
for(i=0; ik; i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==sym)
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(op0 || OrderType()==op)
{
if(mn0 || OrderMagicNumber()==mn)
{
if(ootOrderOpenTime()) oot=OrderOpenTime();
} (以下略。
}
}
}
}
}
return(iBarShift(sym, tf, oot, True));
}.
//+----------------------------------------------------------------------------+

 
2つのサイクルが必要です。1つ目は注文履歴を、2つ目は現在の注文を確認します。どちらの場合も、注文開始時刻がTime[0]以上であれば、現在のローソク足で注文が開始されたことになります。これは、すべての時間枠で言えることです。
 
drknn >>:
Нужно два цикла. В первом проходим по истории ордеров, во втором - по текущим ордерам. В обоих случаях если время открытия ордера больше или равно Time[0], то ордер был открыт на текущей свече. Это справедливо для всех таймфреймов.

クリックありがとうございます。コードにこのように書いてもらうことは可能でしょうか
 
gince >>:

Спадибо, что аткликнулся. А можно попросить это в коде

以下は、歴史の一節の例である。

//=========== SchSellHist()  ===============================
//  Функция возвращает количество Sell-ордеров, лежащих в истории сегодняшних торгов
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int SchSellHist(int MAGIC){
  string SMB=Symbol();
  int SchSell=0;
  int i;
  for (i=OrdersHistoryTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { WriteError(i);}
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        if(OrderOpenTime()>=Time_D0){// сегодняшний ордер
          SchSell++;
        }
      }
    }
  }
 return(SchSell);     
}    
             
//==================================================================================================

特に、目の前にアルゴリズムと既成の例があるのだから、自分なりのコードを考えてみてください。
 
こんにちは、人々!それが動作した後、コードを理解するために私を助けてゴミの多くは、線のチャート矢印円に残っているそれらを削除する方法またはので、それ自体は、ここでコードの一部を削除します
 
void seta(string a_name_0, int a_window_8, double a_datetime_12, double a_price_20, int ai_28, color a_color_32, int a_width_36) {...
ObjectDelete(a_name_0)を実行。
ObjectCreate(a_name_0,OBJ_ARROW, a_window_8, a_datetime_12, a_price_20) を実行します。
ObjectSet(a_name_0, OBJPROP_ARROWCODE, ai_28)です。
ObjectSet(a_name_0, OBJPROP_COLOR, a_color_32)とする。
ObjectSet(a_name_0, OBJPROP_WIDTH, a_width_36);
}

void _setabuy(文字列as_0){。
g_str_concat_356 = StringConcatenate(as_0, gi_120);
seta(g_str_concat_356, 0, TimeCurrent(), Bid + 15.0 * Point, SYMBOL_ARROWUP, Blue, 2)を実行。
gi_120++です。
}

void _setasell(文字列as_0){。
g_str_concat_356 = StringConcatenate(as_0, gi_120);
seta(g_str_concat_356, 0, TimeCurrent(), Bid - 15.0 * Point, SYMBOL_ARROWDOWN, Red, 2)を実行。
gi_120++です。
}
 
drknn >>:

Вот пример прохода по истории


Попробуйте самостоятельно придумать код, тем более, что алгоритм и готовый пример у Вас перед глазами.

ありがとうございます。試してみます。
 
drknn >>:

Вот пример прохода по истории


Попробуйте самостоятельно придумать код, тем более, что алгоритм и готовый пример у Вас перед глазами.

あるいは、現在のバーでポジションがオープンされたかどうかをチェックする関数です(OrdersTotal()とOrdersHistoryTotal()のチェック付き)。Type注文がオープンされた場合、trueを返します。

bool CheckExists(int Type)                                  
 {
  bool Result = True;
  for(int i = 0; i < OrdersTotal(); i++)
   if(OrderSelect(i, SELECT_BY_POS))
    if(OrderType() == Type && OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
     if(OrderOpenTime() >= Time[0])
      Result = False;
  for(i = 0; i < OrdersHistoryTotal(); i++)
   {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
     if(OrderType() == Type && OrderOpenTime() >= Time[0]
        && OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
      Result = False;
    }

  return(Result);
  }
 

その条件を実現する方法を教えてください。

もし(保留中の注文が ある場合)、あれやこれやとやってみましょう。