//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 10.10.2008 |//| Описание : Перенос вещественных чисел из строки в массив |//+----------------------------------------------------------------------------+//| Параметры: |//| st - строка вещественных чисел через точку с запятой |//| ad - массив вещественных чисел |//+----------------------------------------------------------------------------+//| Возврат: |//| Количество элементов в массиве |//+----------------------------------------------------------------------------+int StringToArrayDouble(string st, double& ad[]) {
int i=0, np;
string stp;
ArrayResize(ad, 0);
while (StringLen(st)>0) {
np=StringFind(st, ";");
if (np<0) {
stp=st;
st="";
} else {
stp=StringSubstr(st, 0, np);
st=StringSubstr(st, np+1);
}
i++;
ArrayResize(ad, i);
ad[i-1]=StrToDouble(stp);
}
return(ArraySize(ad));
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.09.2005 |//| Описание : Перенос целочисленных значений из строки в массив |//+----------------------------------------------------------------------------+//| Параметры: |//| st - строка целочисленных значений через запятую |//| ai - целочисленный массив |//+----------------------------------------------------------------------------+//| Возврат: |//| Количество элементов в массиве |//+----------------------------------------------------------------------------+int StringToArrayInt(string st, int& ai[]) {
int i=0, np;
string stp;
ArrayResize(ai, 0);
while (StringLen(st)>0) {
np=StringFind(st, ",");
if (np<0) {
stp=st;
st="";
} else {
stp=StringSubstr(st, 0, np);
st=StringSubstr(st, np+1);
}
i++;
ArrayResize(ai, i);
ai[i-1]=StrToInteger(stp);
}
return(ArraySize(ai));
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 23.06.2008 |//| Описание : Разбиение строки на массив элементов |//+----------------------------------------------------------------------------+//| Возврат: |//| Количество элементов в массиве |//| Параметры: |//| st - строка с разделителями |//| as - строковый массив |//| de - разделитель |//+----------------------------------------------------------------------------+int StrSplit(string st, string& as[], string de=",") {
int i=0, np;
string stp;
ArrayResize(as, 0);
while (StringLen(st)>0) {
np=StringFind(st, ",");
if (np<0) {
stp=st;
st="";
} else {
stp=StringSubstr(st, 0, np);
st=StringSubstr(st, np+1);
}
i++;
ArrayResize(as, i);
as[i-1]=stp;
}
return(ArraySize(as));
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.09.2005 |//| описание : Замена подстроки |//+----------------------------------------------------------------------------+//| Параметры: |//| str - текстовая строка, в которой производится замена |//| strFrom - заменяемая подстрока |//| strTo - заменяющая подстрока |//+----------------------------------------------------------------------------+string StrTran(string str, string strFrom, string strTo) {
int n;
string strOut="", strTemp;
for (n=0; n<StringLen(str); n++) {
strTemp=StringSubstr(str, n, StringLen(strFrom));
if (strTemp==strFrom) {
strOut=StringConcatenate(strOut, strTo);
n=n+StringLen(strFrom)-1;
} else strOut=StringConcatenate(strOut, StringSubstr(str, n, 1));
}
return(strOut);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 23.04.2009 |//| Описание : Перенос уровня стопа в безубыток |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ( "" - любой символ, |//| NULL - текущий символ) |//| op - операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) |//+----------------------------------------------------------------------------+void MovingInWL(string sy="", int op=-1, int mn=-1) {
double po, pp;
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) {
po=MarketInfo(OrderSymbol(), MODE_POINT);
if (OrderType()==OP_BUY) {
if (OrderStopLoss()-OrderOpenPrice()<LevelWLoss*po) {
pp=MarketInfo(OrderSymbol(), MODE_BID);
if (pp-OrderOpenPrice()>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()+LevelWLoss*po, -1);
}
}
}
if (OrderType()==OP_SELL) {
if (OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*po) {
pp=MarketInfo(OrderSymbol(), MODE_ASK);
if (OrderOpenPrice()-pp>LevelProfit*po) {
ModifyOrder(-1, OrderOpenPrice()-LevelWLoss*po, -1);
}
}
}
}
}
}
}
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 29.04.2009 |//| Описание : Возвращает флаг разрешения торговли по времени. |//+----------------------------------------------------------------------------+//| Параметры: |//| TimeBegin - время начала торговли (ЧЧ:ММ) |//| TimeEnd - время окончания торговли (ЧЧ:ММ) |//+----------------------------------------------------------------------------+bool isTradeTimeString(string TimeBegin="00:00", string TimeEnd="00:00") {
datetime dtBegin, dtEnd; // Время начала и окончания работыint hc, he; // Часы текущего времени и окончания работы
dtBegin=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeBegin);
dtEnd =StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeEnd);
hc =TimeHour(TimeCurrent());
he =TimeHour(dtEnd);
if (dtBegin>=dtEnd) {
if (hc>=he) dtEnd+=24*60*60; else dtBegin-=24*60*60;
}
if (TimeCurrent()>=dtBegin && TimeCurrent()<=dtEnd) return(True);
elsereturn(False);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 30.04.2009 |//| Описание : Возвращает флаг разрешения торговли по времени. |//+----------------------------------------------------------------------------+//| Параметры: |//| hb - часы времени начала торговли |//| mb - минуты времени начала торговли |//| he - часы времени окончания торговли |//| me - минуты времени окончания торговли |//+----------------------------------------------------------------------------+bool isTradeTimeInt(int hb=0, int mb=0, int he=0, int me=0) {
datetime db, de; // Время начала и окончания работыint hc; // Часы текущего времени торгового сервера
db=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+hb+":"+mb);
de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+he+":"+me);
hc=TimeHour(TimeCurrent());
if (db>=de) {
if (hc>=he) de+=24*60*60; else db-=24*60*60;
}
if (TimeCurrent()>=db && TimeCurrent()<=de) return(True);
elsereturn(False);
}
Igor Kimは、彼の関数を「関数集」として、1つのファイルにまとめて、ここと彼のホームページで公開しています。このままでは、これらのコレクションをプラグインライブラリーとして利用することはできない。しかし、特にEAを開発する際には、ライブラリを利用することでEAのコードを簡略化・削減することができ、非常に便利です。また、取引操作の正しい使い方に関する疑問が解消され、ストラテジーに集中できるため、プログラミング初心者のトレーダーには特に有効な機能です。 添付のファイルには、同じ関数の集まりが、ライブラリとして設計されています。ライブラリは、.../experts/include ディレクトリに置くだけで、コンパイルする必要はありません。 接続後は、EAコードから必要な関数を呼び出せばよい。
#include <b-Positions_include.mqh> // Библиотека функций для работы с позициями #include <b-KimIV_include.mqh> // Библиотека дополнительных функций#include <b-Orders_include.mqh> // Библиотека функций для работы с ордерами
StringLower()関数です。
説明:文字列を 小文字に変換する。SIGNIFICANT(大文字)はすべて小文字になります。StringLower() 関数は、入力される文字列を1つの必須パラメータとしてのみ受け付けます。
StringUpper()関数です。
説明:文字列を 大文字に変換する。小文字はすべて大文字になります。StringUpper() 関数は、必須パラメータである入力文字列を1つだけ受け付けます。
StringToArrayDouble()関数を使用します。
この関数は、文字列を構成する実数に分割し、各数値を個別の要素として配列に追加する。文字列中に現れる実数の数だけ、同じ数の要素が配列に追加されます。セミコロンはセパレータとして認識されます。StringToArrayDouble() 関数は、配列の要素数を返す関数であり、以下の必須パラメータをとる。
StringToArrayInt()関数を使用します。
この関数は、文字列を構成する各整数に分割し、それぞれの数値を個別の要素として配列に追加します。文字列の中にある整数の数と同じ数の要素が配列に追加されます。カンマはセパレータとして認識される。StringToArrayDouble() 関数は、配列の要素 数を返す関数であり、以下の必須パラメータをとる。
StrSplit()関数です。
この関数は、文字列をその部分文字列に分割し、それぞれの部分文字列が配列の個別の要素になるようにします。セパレータはパラメータで指定されるが、任意である。StrSplit() 関数は、配列の要素数を返す関数で、以下のパラメータを受け付けます。
StrTran()関数です。
この関数は、部分文字列を置き換えます。出現するものはすべて置き換えられる。例えば、すべてのカンマをドットに、あるいはその逆を一度に置き換えることができます。StrSplit() 関数は、結果の文字列を返す関数であり、以下の必須パラメータを受け付ける。
関数 isTradeTimeString()。
この関数は、時間による取引を許可するフラグを返します。 実際には、取引サーバーの現在時刻が特定の時間間隔内にあるかどうかをチェックします。この関数の特徴は、時間間隔を1日の内側と外側の両方で指定できることです。これについては、使用例で詳しく紹介する。isTradeTimeString()関数には、以下のオプションパラメータを指定できます。
関数 isTradeTimeInt()。
この関数は、時間指定取引を許可するフラグを返します。 返される値は、true または false です。関数 isTradeTimeInt() は、時間間隔認識の原理により、関数isTradeTimeString() と同様、取引開始時刻が大きくても(一日内の時間間隔)小さくても(異なる日内の時間間隔)よい。関数 isTradeTimeInt()は、以下のオプションパラメータを受け付ける。
添付のファイルには、同じ関数の集まりが、ライブラリとして設計されています。ライブラリは、.../experts/include ディレクトリに置くだけで、コンパイルする必要はありません。
接続後は、EAコードから必要な関数を呼び出せばよい。
親愛なる、ラインのどこを。
isCloseLastPosByStop()関数です。
この関数は、ストップによる最後のポジションのクローズフラグを返します。フラグが立っている -True- StopLossをトリガーした。フラグを下げた -False- ポジションは別の理由で閉鎖されました。考慮すべき位置をより正確に選択するために、外部パラメータを使用して設定します。
まだ5桁の数字がない時代に書かれた機能だと理解しています。日本円は一種の比較対象であった。
1つ増やすのは難しくない!