KimIVの便利な機能 - ページ 18

 
rid писал (а):
MAです。投稿は24時間キープします~その後、削除します

削除する必要はありません!そのままでいい...

 

Igorさん、まず最初に、あなたの関数とこのブランチに感謝します、これらは多くの非専門のプログラマーを助けてくれます。でも、NumberOfOrders()関数について質問したいのです。うまく動作させることができないそれを標準のMACD Expert Advisorに落とし込んで、使い方の一例を示しています。コードを貼り付けています。

簡単に説明すると、そこが変わったということです。

// в стандартной версии  
total=OrdersTotal();
   if(total<1) 
     {
// бла бла бла ...
// в моей версии эксперта
   total=OrdersTotal(); // total я оставил т.к. он используется дальше
   if(NumberOfOrders(NULL,-1,-1)<1) 
     {
// бла бла бла ... ну и плюс сама функция NumberOfOrders() ниже
当然ながら、うまくいきません。何が問題なのか、説明していただけますか?ありがとうございました。
ファイル:
 
seifer писал (а):
何が問題なのか説明してください。ありがとうございました。

2つのコメント

1.私ならこうします。

total=NumberOfOrders(NULL);
if (total<1) {
  ...
}
2.関数NumberOfOrders() は、注文数 - BuyLimit、BuyStop、SellLimit、SellStop タイプの取引数 を返します。変更したExpert Advisorは、注文に対応しません。市場価格でポジションを建てる、つまり買いと売りの取引を 行います。次回の記事で紹介するNumberOfPositions() 関数を使用する必要があるのです。
 

NumberOfPositions()関数です。

この関数は、現在オープンしているポジションの数を返します。より正確なカウント位置の選択は、外部パラメータで指定します。

  • sy- 市場商品の名前。このパラメータが設定されている場合、この関数は指定された楽器の位置のみを考慮します。初期値」は、あらゆる市場商品を意味する。NULLは 現在の楽器を意味します。
  • op- 貿易業務、ポジションタイプ。有効な値:OP_BUYOP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子,MagicNumber.デフォルト値-1 は、任意の識別子を意味する。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }
        }
      }
    }
  }
  return(kp);
}
NumberOfPositions()関数をテストするスクリプトを添付しています。
ファイル:
 

うわー!デザインかと思った。

      ...
      ot=OrderType();
      if (ot>1 && ot<6) {
      ...
は、すべてのポジション(OP_SELLとOP_BUYを含む)を通過することになります。今はすべてうまくいっています。いつもありがとうございます。
 

GetProfitFromDateInCurrency()関数を使用します。

この関数は、ある日付以降に決済されたポジションの通貨建ての利益の合計を返します。考慮すべき位置をより正確に選択するために、外部パラメータを使用して指定します。

  • sy- 市場商品の名前。このパラメータを指定すると、この関数はこの楽器の位置だけを考慮します。初期値」は、あらゆる市場商品を意味する。NULLは 現在の楽器を意味します。
  • op- 貿易業務、ポジションタイプ。有効な値:OP_BUYOP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子,MagicNumber.デフォルト値-1 は、任意の識別子を意味する。
  • dt- 1970年からの秒単位で表される日付と時刻.デフォルト値-0は、履歴で利用可能なすべてのポジションが考慮されることを意味します。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит в валюте депозита                  |
//|             закрытых с определённой даты позиций                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0)
{
  double p=0;
  int    i, 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=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              p+=OrderProfit()+OrderCommission()+OrderSwap();
            }
          }
        }
      }
    }
  }
  return(p);
}

HH. 関数GetProfitFromDateInCurrency()をテストするためのスクリプトを添付します。

この機能の使い方をより実践的に学べるのが、期間別の利益の絶対値やパーセントを表示する「i-Profit」です。

 

イゴールさん、こんにちは。

相関図にお礼を言いたい。 選択肢があったので、それをはっきりさせたかった)

私もそんな疑問を持っています。リアルタイムモードでExpert Advisorを テストしていると、よくエラー130 - wrong stopに遭遇します。私はそれを分析しない、ある状況下でなぜそれが発生するのか理解しない。この構造を使うようになったのは

   double md = MarketInfo(Symbol(), MODE_TICKSIZE);
   return(NormalizeDouble(Value/md, 0) * md);

この構成でストップとTPを正規化するようになったのですが、解決には至りませんでした。同じような状況に直面したことがあるかもしれないので、その対処法や分析方法を教えてください。

はっきり言うと、始値から+1pのところにストップを設定しようとすると、この現象がよく起こります。

 
scorpionk писал (а):
encounter error 131 - Incorrect stop.

131- 体積が正しくない、体積造粒のエラー。取引されるロットの大きさです。

 
KimIV:
scorpionk wrote (a):
error 131 - Wrong stop に遭遇しました。

131- 音量が正しくありません。音量の造粒に誤りがあります。取引されるロットの大きさです。

131ではなく、130です。

 
scorpionk:

コードが違います、131ではありません、130です。

なるほど...。

以下のように正規化してみてください。

int dg=MarketInfo(Symbol(), MODE_DIGITS);
return(NormalizeDouble(Value, dg));
そうすると、エラー130が 発生しないのです。