//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 20.04.2007 |//| Описание : Возвращает индекс ордера или позиции по тикету |//+----------------------------------------------------------------------------+//| Параметры: |//| ti - тикет ордера, позиции |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+intIndexByTicket(intti, stringsy="", intop=-1, intmn=-1){inti, 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);
}
IndexByTicket()関数です。
チケット上の注文またはポジションのインデックス(セットオーダーまたはオープンポジションの一般リストにおける序列番号)を返します。IndexByTicket()が、必要なチケットを持つ注文またはポジションを見つけられない場合、-1を 返します。関数のパラメータを使用して、チェックする注文やポジションのリストを制限することができます。
カスタムEAでIndexByTicket() 関数を書きました。それがないとやっていけない、そうでなければなぜ書いたのか、ということを思い出した。でも、そこでどう使われたのか、なぜ実質的に書いたのか、思い出せません:-)アドバイザーのソースコードを探しても、つまらない。何百本もあるんですよ。
とにかく、今までのような例を出しても意味がないと思うんです。頭が良ければ、どこにパラメータを「置く」かを考えることができる。また、IndexByTicket() 関数を使った良いアイデアをお持ちの方がいらっしゃいましたら、ここに投稿してください。実現できるように頑張ります。
簡単なお知らせです。
関数SelectByTicket()、SelectByTicketFromHistory() を廃止しました。自分では使わないから、公開する意味がない。このテーマで議論したい人はいつでも歓迎します。私の妄想をすべてそのまま見せます。
NumberOfOrders()関数を使用します。
この関数は、注文数を返すものであり、機能的にはExistOrders() を完全にオーバーライドする。ExistOrders() 関数をNumberOfOrders() 関数に置き換えるには、返り値が 0 よりも大きいことを確認すれば十分である。関数のパラメータを使用して、チェックする注文のリストを制限することができます。
NumberOfOrders()関数の使用例です。
上記の例で動作するスクリプトを再度添付します。
NumberOfOrders()関数を使用します。
この関数は、注文数を返すものであり、機能的にはExistOrders() を完全にオーバーライドする。ExistOrders() 関数をNumberOfOrders() 関数に置き換えるには、返り値が 0 よりも大きいことを確認すれば十分である。関数のパラメータを使用して、チェックする注文のリストを制限することができます。
少し混乱しています。なぜか、何か矛盾を感じる。ここです。
"...は、戻り値が0より大きいことを確認することが必要かつ十分 である。"
これだけ」をチェックしたら、注文数 に関する機能は意味がない!
それがきっかけで、のめり込むようになったんです。Expert Advisorにこの機能を挿入しています。パラメータでm=1を設定し、ポジションをオープンする条件にしています。
しかし、まるでExpert Advisorがこの制限に気づいていないかのようです。そして、すべてのシグナルで注文を開く。
ここで何が問題になり得るのか。
少し混乱しています。なぜか、ある種の矛盾を感じてしまうのです。ここです。
"...は、戻り値が0より大きいことを確認することが必要かつ十分 である」。
これだけ」をチェックするのであれば、注文数の関数は意味がないのです
ふむExistOrders() とNumberOfOrders() のそれぞれの関数が返す情報量に注目していないようですね。ExistOrders() 関数は注文の存在に関する 情報のみを返し、NumberOfOrders() 関数は注文の数に関する 情報を返します。注文数に関する情報には、注文の有無に関する情報が含まれる。注文が存在するかどうかの質問に答える必要がある場合、注文数の情報は冗長である。だから、ExistOrders() 関数をNumberOfOrders() 関数に置き換えるなら、NumberOfOrders() 関数が返す値が0より大きいかどうかを確認するようにと言ったのです。結局、この値が0であれば注文はなく、0より大きければ注文があることは明らかである。ExistOrders() 関数は注文数に関する情報が不要な場合に使用でき、NumberOfOrders() 関数は注文数に関する情報が不要な場合と必要な場合に使用することができる。その意味で、NumberOfOrders() 関数はExistOrders() 関数に完全に取って代わります。
私が調べ始めた理由は、ここにあります。Expert Advisorにこの機能を挿入しています。パラメータでm=1を設定し、ポジションをオープンする条件にしています。
しかし、まるでExpert Advisorがこの制約に気づいていないかのようです!そして、すべてのシグナルで注文を開く。
ここで問題になりそうなことは何でしょうか?
ありがとうございます。すべて手に入れた。1つ目の質問についても、2つ目の質問についてもです。
つまり、「拡張」された NumberOfOrders() 関数には、本質的にすでにIndexByTicket( ) 関数が含まれているのです。
そうですね、確かに。O P_BUYとOP_SELLをオープン しました !
やはり、ポジションと全く同じ働きをする次の関数の例を挙げなければなりませんね。(注文は不可)。
この掲示板のどこかにすでに投稿されていたと記憶しています。見つからないんです。
あとは、ポジションと全く同じ働きをする次の関数の例を挙げるだけです。(注文と関係ない)
注文のための機能はもういいんです。次に、ポジションに関する機能です。その数、約30個。
フォーラムのどこかで既に投稿されていたのを覚えています。見つからない。
探索
イゴール様、お力添えをお願いします!複数の商品のポジションを取ることができる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ファイルを扱うための関数ライブラリ」で質問したのですが、回答がありませんでした :(