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

 

イゴールさん、返信ありがとうございます!わかりました。御社の機能は単体でも使っていますが、EAを開発する段階でライブラリを活用したいと思いました。

komposterさんの trade_lib&info_lib ライブラリがどのように作られているかを見て、自分用にあなたのものを少し変更しました。

1.すべてのライブラリで#property libraryと #include libraryのクロスリンクを削除し、混同しないようにライブラリ名を変更しました。

2.すべてのライブラリを直接呼び出すブロックを作りました。

#include <b-Positions#.mqh>        // Библиотека функций для работы с позициями 
#include <b-KimIV#.mqh>            // Библиотека дополнительных функций
#include <b-Orders#.mqh>           // Библиотека функций для работы с ордерами
#include <stdlib.mqh>              // Стандартная библиотека
#include <WinUser32.mqh>           // Стандартная библиотека  

これで、すべてのライブラリのすべての関数が利用可能になり、コンパイル時のエラーや犯罪メッセージも、通常の「is not referenced...」以外、一切発生しなくなりました。

全ての外部 EAが使用可能であり、問題はない。

もっと書けば、つながる、使える。まず、トータルプロフィットによるトレーリング機能が欲しいです。

 

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

この関数は、その月の週を日付別に返します。オプションのパラメータを1つだけ受け付けます。

  • dt- 日付,時刻.デフォルト値 -0- 取引サーバーの現在の日付と時間。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.08.2008                                                     |
//|  Описание : Возвращает номер недели месяца по дате                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    dt - дата, время           (0 - сейчас по времени торгового сервера)    |
//+----------------------------------------------------------------------------+
int WeekOfMonth(datetime dt=0) {
  if ( dt<=0) dt=TimeCurrent();
  datetime d;
  int      i, kd=TimeDay( dt), nn=1;

  for ( i=2; i<= kd; i++) {
    d=StrToTime(TimeYear( dt)+"."+TimeMonth( dt)+"."+ i);
    if (TimeDayOfWeek( d)==1) nn++;
  }
  return( nn);
}

SZYさん、WeekOfMonth()関数をテストするスクリプトを添付します。

ファイル:
 
イゴール、ロットの大きいものから順に全ポジションをクローズする機能はないのでしょうか?
 

イゴールさん、こんにちは!便利な機能、どうもありがとうございます!どんどん使わせていただきます!私も最近始めたばかりなので、質問なのですが...。もうずいぶん前から使っているので。OpenPositionという関数を使っているのですが、もしかしたらエラーか何かに反応しているのでしょうか? 昨日のログです、それ以前は全て順調でしたエラー220が 見つからない...................。

07:47:28 MetaTrader 4.00 build 220 起動(MetaQuotes Software Corp.)
07:47:28 Expert open prob USDJPY EURUSD,M1: ロード成功
07:47:32 '1262868': ログイン
07:47:44 '1262868': ログイン
07:49:40 '1262868': ログイン
07:49:46 '1262868': ログイン
07:54:44 '1262868': Connect failed [No connection]
11:38:16 Expert open prob USDJPY EURUSD,M1: 削除
11:38:18 MetaTrader 4.00 build 220 stopped
14:05:05 MetaTrader 4.00 build 220 started (MetaQuotes Software Corp.))
14:05:05 Expert open prob USDJPY EURUSD,M1: loaded successfully
14:05:10 '1262868': login
14:05:31 '1262868': login
14:06:39 '1262868': login
14:06:46 '1262868': login
15:57:06 '1262868': connect failed [No connection]
18:30:46 Expert open prob USDJPY EURUSD,M5.M1: ロードに成功しました。removed
18:30:49 Main pumping: timeout on stop
18:30:52 Main pumping: timeout on stop
18:30:55 Main pumping: timeout on stop
18:30:58 Main pumping: timeout on stop
18:31:01 Main pumping: timeout on stop
18:31:01 Main pumping: terminated
18:31:02 MetaTrader4.NETは、MetaTrader4.00 build 220 stopped
18:31:02 MetaTrader 4.00 build 220 stopped because system shutdown
18:47:57 MetaTrader 4.00 build 220 started (MetaQuotes Software Corp.).)
18:47:58 Expert open prob USDJPY EURUSD,M5: loaded successfully
18:48:01 '1262868': connect failed [No connection]
18:48:10 '1262868': login
18:48:20 '1262868': login
20:19:00 '1262868': login
20:19:07 '1262868': login
20:20:05 '1262868': login
20:20です。13 '1262868': ログイン
20:59:29 '1262868': ログイン
20:59:39 '1262868': ログイン
21:02:16 '1262868': ログイン
21:02:41 '1262868': DataCenter connecting failed [6]
22:08:40 '1262868': Ping failed
22:08:43 '1262868': ログイン
22:08:49 '1262868': DataCenter connecting failed [6]
22:1001 '1262868': login
22:10:05 '1262868': DataCenter connecting failed [6]
22:14:59 '1262868': login
22:15:13 '1262868': login
22:15:22 '1262868': DataCenter connecting failed [6]
22:37:16 '1262868': login
22:37:27 '1262868': DataCenter connecting failed [6]
22:4051 '1262868': login
22:41:04 '1262868': DataCenter connecting failed [6]
23:17:14 Expert open prob USDJPY EURUSD,M5: removed
23:17:16 Expert open prob USDJPY EURUSD,M5: loaded successfully
23:25:52 Expert open prob USDJPY EURUSD,M5: removed
23:25:55 MetaTrader 4.NetCenter.00 build 220 stopped
23:25:59 MetaTrader 4.00 build 220 started (MetaQuotes Software Corp.))
23:26:05 '1262868': ログイン
23:26:05 Expert open prob USDJPY EURUSD,M5: ロード成功
23:26:15 '1262868': ログイン
23:27:19 '1262868': ログイン
23:27:34 '1262868': ログイン
23:28:20 Expert open prob USDJPY EURUSD,M5: 削除
23:28:25 Expert open pro USDJPY USDCHF,H4: ロード成功
23:28:33 Expert open pro USDJPY USDCHF,H4: 削除

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

 
khorosh писал(а)>>
イゴール、ロットの大きいものから順に全ポジションをクローズする機能はないのでしょうか?

は...書いた...。

ClosePosBySortLots()関数です。

ロットサイズ順にポジションをクローズする機能です。つまり、この機能を使えば、ロット数の昇順または降順でポジションを決済することができます。関数ClosePosBySortLots() は、以下のオプションパラメータを受け付けます。

  • sy- 取引商品の名前。""- 任意の楽器、NULL- 現在の楽器。初期値は"" である。
  • op- 貿易業務の種類。有効な値-1- 任意のポジション、OP_BUY- 買い、OP_SELL- 売りを指定します。初期値は-1 である。
  • mn- MagicNumber、取引操作の一意な識別子。デフォルト値-1- 任意のマジックナンバー。
  • sd- ロットサイズのソート方向.有効な値MODE_ASCEND- 昇順、MODE_DESCEND- 降順。初期値はMODE_DESCEND である。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.12.2008                                                     |
//|  Описание : Закрытие позиций в порядке сортировки по размерам лотов.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        (    ""       - любой символ,      |
//|                                             NULL      - текущий символ)    |
//|    op - операция                        (    -1       - любая позиция)     |
//|    mn - MagicNumber                     (    -1       - любой магик)       |
//|    sd - Направление сортировки лотов    (MODE_ASCEND  - возрастание,       |
//|                                          MODE_DESCEND - убывание)          |
//+----------------------------------------------------------------------------+
void ClosePosBySortLots(string sy="", int op=-1, int mn=-1, int sd= MODE_DESCEND) {
  double a[][2];                  // Массив лотов и тикетов
  int    i, k=OrdersTotal();      // Счётчик и количество ордеров
  int    p=0;                     // Количество позиций

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()== sy || sy=="") && ( op<0 || OrderType()== op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( mn<0 || OrderMagicNumber()== mn) {
            p++;
            ArrayResize( a, p);
            a[ p-1][0]=OrderLots();
            a[ p-1][1]=OrderTicket();
          }
        }
      }
    }
  }

  // вдруг позиций нету, тогда и закрывать нечего
  if ( p>0) {
    ArraySort( a, WHOLE_ARRAY, 0, sd);
    for ( i=0; i< p; i++) {
      if (OrderSelect( a[ i][1], SELECT_BY_TICKET)) {
        // проверим незакрытость на всякий случай,
        // может какая-то позиция уже закрылась по стопу/тейку
        if (OrderCloseTime()==0) ClosePosBySelect();
      }
    }
  }
}

SZY. ClosePosBySortLots()関数をテストするスクリプトを添付しています。

ファイル:
 

AddLeadingZero()関数です。

この関数は、文字列の長さがある値に等しくなるように、先頭(左)のゼロ "0" をいくつでも追加します。AddLeadingZero() 関数は、以下の必須パラメータを受け付ける。

  • s- 先頭のゼロが追加される文字列.
  • k- 結果として得られる文字列Sの 長さ.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Добавляет к строке S столько лидирующих нулей "0",             |
//|           : чтобы длина строки S стала равна K.                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    s - строка                                                              |
//|    k - длина строки S                                                      |
//+----------------------------------------------------------------------------+
string AddLeadingZero(string s, int k) {
  while(StringLen( s)< k) s=StringConcatenate("0", s);
  return( s);
}

SZU. AddLeadingZero()関数をテストするスクリプトを添付しています。

ファイル:
 

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

この関数は,2つ/3つの整数を時刻形式の文字列に変換する。この関数に2つの数値が渡された場合、最初の数値が時間として、2番目の数値が分として使用されます。フォーマット文字列は "HH:MM "が返される。数字が3つある場合、3つ目の数字は秒に置き換えられ、この関数は「HH:MM:SS」文字列を返します。toTime() 関数には、以下のオプションパラメータを指定することができる。

  • h- 時計初期値は0 です。
  • m- 議事録。初期値は0 です。
  • s- 秒数.0- 使用しないでください。初期値0
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Преобразует два/три целых числа в строку в формате времени     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    h - часы                                                                |
//|    m - минуты                                                              |
//|    s - секунды           (0 - не использовать)                             |
//+----------------------------------------------------------------------------+
string toTime(int h=0, int m=0, int s=0) {
  string st="";

  if ( h==0) st="00:";
  else      st=StringConcatenate( AddLeadingZero( h, 2), ":");

  if ( m==0) st=StringConcatenate( st, "00");
  else      st=StringConcatenate( st, AddLeadingZero( m, 2));

  if ( s!=0) st=StringConcatenate( st, ":", AddLeadingZero( s, 2));

  return( st);
}

ZS. toTime()関数をテストするスクリプトを添付します。

ファイル:
 

イゴール、価格が変数の1つ、例えばb=1.2400, s=1.2300に一致したときに対応するシグナルを出すような関数を提案してもらえませんか。

b=価格の場合 sig=1、s=価格の場合 sig=-1。

ずさんな内容で申し訳ありません)。

 
Prival >> :
すみません、私はイゴールではありません。でも、もしかしたらこれが役に立つかもしれない。

私も謝ります。>>より正確です。

//+------------------------------------------------------------------+
//| Функция                                                          |
//+------------------------------------------------------------------+
int Sign(double b, double s)
   {
   double var, e; var=Close[0]; e=0.000001;
   if( var< b+ e && var> b- e) return( 1);
   if( var< s+ e && var> s- e) return(-1); 
   return(0);
   }
 
Prival >> :

...スレッドを乱立させないよう、今夜までに自分の投稿を削除します...。

必要ない。見てもらうと、正確な価格値が一貫してつかめないということに目が覚めるでしょう。