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

 

IndexByTicket()関数です。

チケット上の注文またはポジションのインデックス(セットオーダーまたはオープンポジションの一般リストにおける序列番号)を返します。IndexByTicket()が、必要なチケットを持つ注文またはポジションを見つけられない場合、-1を 返します。関数のパラメータを使用して、チェックする注文やポジションのリストを制限することができます。

  • sy- 楽器の名称。このパラメータを指定すると、指定した商品の注文とポジションのみをチェックします。NULLは 現在の楽器、""(デフォルト)は任意の楽器を意味します。
  • op- 取引操作、保留中の注文またはポジションのタイプ。有効な値:OP_BUY、OP_BUYLIMIT、OP_BUYSTOP、OP_SELL、OP_SELLLIMIT、OP_SELLSTOP、または-1。デフォルトの値である- 1は、任意の順序または位置を示す。
  • mn- 注文またはポジションの識別子(MagicNumber)。デフォルト値-1 は任意のMagicNumberを意味する。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.04.2007                                                     |
//|  Описание : Возвращает индекс ордера или позиции по тикету                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ti - тикет ордера, позиции                                              |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int IndexByTicket(int ti, string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();

  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 ((mn<0 || OrderMagicNumber()==mn) && OrderTicket()==ti) return(i);
      }
    }
  }
  return(-1);
}
 

カスタムEAでIndexByTicket() 関数を書きました。それがないとやっていけない、そうでなければなぜ書いたのか、ということを思い出した。でも、そこでどう使われたのか、なぜ実質的に書いたのか、思い出せません:-)アドバイザーのソースコードを探しても、つまらない。何百本もあるんですよ。

とにかく、今までのような例を出しても意味がないと思うんです。頭が良ければ、どこにパラメータを「置く」かを考えることができる。また、IndexByTicket() 関数を使った良いアイデアをお持ちの方がいらっしゃいましたら、ここに投稿してください。実現できるように頑張ります。


簡単なお知らせです。

関数SelectByTicket()、SelectByTicketFromHistory() を廃止しました。自分では使わないから、公開する意味がない。このテーマで議論したい人はいつでも歓迎します。私の妄想をすべてそのまま見せます。

 

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

この関数は、注文数を返すものであり、機能的にはExistOrders() を完全にオーバーライドする。ExistOrders() 関数をNumberOfOrders() 関数に置き換えるには、返り値が 0 よりも大きいことを確認すれば十分である。関数のパラメータを使用して、チェックする注文のリストを制限することができます。

  • sy- 楽器の名称。このパラメータが指定された場合、この関数は指定された商品の注文のみをチェックします。NULLは 現在の計測器、""(デフォルト)は任意の計測器を意味する。
  • op- 保留注文の種類。有効な値:OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT、OP_SELLSTOP、または-1。デフォルトの値である- 1は、任意の順序を示す。
  • mn- オーダー識別子(MagicNumber)。デフォルト値-1 は任意のMagicNumberを意味する。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает количество ордеров.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), ko=0, ot;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) ko++;
        }
      }
    }
  }
  return(ko);
}
 

NumberOfOrders()関数の使用例です。

  1. 全注文の合計金額を取得する
    NumberOfOrders();
  2. 現在のシンボルに対する注文 件数の取得
    NumberOfOrders(NULL);
  3. 任意のシンボルに対するBuyLimit注文数の取得
    NumberOfOrders("", OP_BUYLIMIT);
  4. EURUSDのマジックナンバー123456のSellStop注文数の取得
    NumberOfOrders("EURUSD", OP_SELLSTOP, 123456);
  5. 現在のシンボルのマジックナンバー2345の注文数を取得します。
    NumberOfOrders(NULL, -1, 2345);

上記の例で動作するスクリプトを再度添付します。

ファイル:
 
KimIV:

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

この関数は、注文数を返すものであり、機能的にはExistOrders() を完全にオーバーライドする。ExistOrders() 関数をNumberOfOrders() 関数に置き換えるには、返り値が 0 よりも大きいことを確認すれば十分である。関数のパラメータを使用して、チェックする注文のリストを制限することができます。

  • sy- 楽器の名称。このパラメータが指定された場合、この関数は指定された商品の注文のみをチェックします。NULLは 現在の計測器、""(デフォルト)は任意の計測器を意味する。
  • op- 保留注文の種類。有効な値:OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT、OP_SELLSTOP、または-1。デフォルトの値である- 1は、任意の順序を示す。
  • mn- オーダー識別子(MagicNumber)。初期値の- 1は任意のMagicNumberを意味する。

少し混乱しています。なぜか、何か矛盾を感じる。ここです。

"...は、戻り値が0より大きいことを確認することが必要かつ十分 である。"

これだけ」をチェックしたら、注文数 に関する機能は意味がない!

それがきっかけで、のめり込むようになったんです。Expert Advisorにこの機能を挿入しています。パラメータでm=1を設定し、ポジションをオープンする条件にしています。

if (NumberOfOrders("", -1, MagicNumber)<m) {//если открытых позиций МЕНЬШЕ m

しかし、まるでExpert Advisorがこの制限に気づいていないかのようです。そして、すべてのシグナルで注文を開く。

ここで何が問題になり得るのか。

 
rid писал (а):
少し混乱しています。なぜか、ある種の矛盾を感じてしまうのです。ここです。
"...は、戻り値が0より大きいことを確認することが必要かつ十分 である」。
これだけ」をチェックするのであれば、注文数の関数は意味がないのです

ふむExistOrders()NumberOfOrders() のそれぞれの関数が返す情報量に注目していないようですね。ExistOrders() 関数は注文の存在に関する 情報のみを返し、NumberOfOrders() 関数は注文の数に関する 情報を返します。注文数に関する情報には、注文の有無に関する情報が含まれる。注文が存在するかどうかの質問に答える必要がある場合、注文数の情報は冗長である。だから、ExistOrders() 関数をNumberOfOrders() 関数に置き換えるなら、NumberOfOrders() 関数が返す値が0より大きいかどうかを確認するようにと言ったのです。結局、この値が0であれば注文はなく、0より大きければ注文があることは明らかである。ExistOrders() 関数は注文数に関する情報が不要な場合に使用でき、NumberOfOrders() 関数は注文数に関する情報が不要な場合と必要な場合に使用することができる。その意味で、NumberOfOrders() 関数はExistOrders() 関数に完全に取って代わります。

ライドを 行います。

私が調べ始めた理由は、ここにあります。Expert Advisorにこの機能を挿入しています。パラメータでm=1を設定し、ポジションをオープンする条件にしています。

if (NumberOfOrders("", -1, MagicNumber)<m) {//если открытых позиций МЕНЬШЕ m

しかし、まるでExpert Advisorがこの制約に気づいていないかのようです!そして、すべてのシグナルで注文を開く。

ここで問題になりそうなことは何でしょうか?

で...、ここであなたはポジションとワラントを混同しているようです。私にとっては、それらは別物なのです。ポジションとは何ですか?私の理解では、注文はOP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP取引ですが、これらはOP_BUYとOP_SELLの取引 です。私はポジションを開き、注文を設定します。で、何を開けるんですか?NumberOfOrders() 関数は、注文を処理するために設計されています。
 

ありがとうございます。すべて手に入れた。1つ目の質問についても、2つ目の質問についてもです。

つまり、「拡張」された NumberOfOrders() 関数には、本質的にすでにIndexByTicket( ) 関数が含まれているのです。

そうですね、確かに。O P_BUYとOP_SELLをオープン しました !

やはり、ポジションと全く同じ働きをする次の関数の例を挙げなければなりませんね。(注文は不可)。

この掲示板のどこかにすでに投稿されていたと記憶しています。見つからないんです。

 
rid писал (а):
あとは、ポジションと全く同じ働きをする次の関数の例を挙げるだけです。(注文と関係ない)

注文のための機能はもういいんです。次に、ポジションに関する機能です。その数、約30個。


rid さんが書き込みました(a):
フォーラムのどこかで既に投稿されていたのを覚えています。見つからない。

探索

 

イゴール様、お力添えをお願いします!複数の商品のポジションを取ることができるEAを追加する必要があります。標準のMACDとEMAの2つのEAが動作しており、それぞれ6つのポジションを持っていますが、1つのポジションしか開きません...。これに関するコメントを読ませていただきましたが、言葉が不自由なため、どこに何を追加すればいいのかが分かりません...。差し支えなければ、ご協力お願いします...。コピーされた絵馬のアドバイザー...ありがとうございました。



//+--------------------------------------------------------------+
//| Parabolic.mq4 |
//| Vitalik |
//| wwwita@mail.ru |
//+--------------------------------------------------------------+
extern double Lots=0.1;
extern double Pip=5;
extern double MoveBack=3;
extern int chk=0;
extern double SL=20;
//+----------------------------------------------------------------+
//|
//+----------------------------------------------------------------+
int start()
{
double hi=High[1];
double lo=Low[1](High[1] の場合);
double EMA, EMA1, EMA2, EMA3;
int cnt=0, ticket, total;
EMA=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,1);
EMA1=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,1) です。
EMA2=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,0);
EMA3=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,0);
total=OrdersTotal();
if(total<1)
{
if(AccountFreeMargin() <(1000*Lots)).
{
Print("あなたにはお金がありません。自由資金 = ", AccountFreeMargin());
return(0);
}.
if(((EMA>EMA1 && (EMA2<EMA3)) || ((EMA<EMA1) && (EMA2>EMA3)))
{
chk=1;
Print("Position is possible!");
}.
if(chk==1)
{
if(EMA3-EMA2>2*Point && Bid>=(lo+MoveBack*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,
"EMA position:",16385,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)).
Print("SELL order open : ",OrderOpenPrice());
chk=0;
}.
else
{
Print("Error opening SELL order : ",GetLastError());
return(0);
}.
}
if(EMA2-EMA3>2*Point && Ask<=(hi-MoveBack*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,
"EMA position:",16385,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)).
Print("BUY order open : ",OrderOpenPrice());
chk=0;
}.
else
{
Print("オーダーBUYオープンエラー : ",GetLastError());
return(0);
}.
}
}
return(0);
}.
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // これはオープンポジション ですか?OP_BUY or OP_SELL
OrderSymbol()==Symbol()) // ツールが一致するか?
{
if(OrderType()==OP_BUY) // ロングポジションがオープン
{
// もうクローズする時間かどうかチェックしてみよう
if(Bid>=(OrderOpenPrice()+Pip*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // クローズポジション
return(0); // exit
}
if(Bid<=(OrderOpenPrice()-SL*Point)).
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // Close position
return(0); // exit
}
}
else // さもなければこれはショートポジション
{
// すでにクローズの時間かどうかチェックする?
if(Ask<=(OrderOpenPrice()-Pip*Point)).
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // クローズポジション
return(0); // exit
}
if(Ask>=(OrderOpenPrice()+SL*Point)).
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // クローズポジション
return(0); // 終了
}
}
}
}
return(0);
}.
//+------------------------------------------------------------------+
 

Igorさん、「INIファイルを扱うための関数ライブラリ」で質問したのですが、回答がありませんでした :(