//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 13.05.2008 |//| Описание : Возвращает дату понедельника по номеру недели |//+----------------------------------------------------------------------------+//| Параметры: |//| (-2 - предпредыдущая неделя) |//| (-1 - предыдущая неделя) |//| nn - номер недели ( 0 - текущая неделя) |//| ( 1 - следующая неделя) |//| ( 2 - последующая неделя) |//+----------------------------------------------------------------------------+datetime DateOfMonday(int nn=0) {
datetime dt=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
while (TimeDayOfWeek(dt)!=1) dt-=24*60*60;
dt+=nn*7*24*60*60;
return (dt);
}
関数Fibonacci()です。
この関数は、フィボナッチ級数の要素をそのシーケンス番号で返します。
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 07.08.2008 |//| Описание : Возвращает элемент ряда Фибоначчи по его порядковому номеру. |//+----------------------------------------------------------------------------+//| Параметры: |//| n - номер элемента ряда |//+----------------------------------------------------------------------------+int Fibonacci(int n) {
int a=0, b=0, i=1, s=0;
if (n==1) s=1;
if (n>1) {
s=1;
while (i<n) {
i++;
a=b;
b=s;
s=a+b;
}
}
return(s);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.09.2005 |//| Описание : Возвращает ценовую разницу в пунктах между двумя барами. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" или NULL - текущий символ) |//| tf - таймфрейм ( 0 - текущий таймфрейм) |//| n2 - номер левого бара ( 2 - второй бар) |//| n1 - номер правого бара ( 1 - первый бар) |//| Возвращаемое значение: |//| положительное - между барами N2 и N1 был рост курса |//| отрицательное - между барами N2 и N1 было снижение курса |//+----------------------------------------------------------------------------+int GetPriceDiffInPoint(string sy="0", int tf=0, int n2=2, int n1=1) {
if (sy=="" || sy=="0") sy=Symbol();
double p=MarketInfo(sy, MODE_POINT);
int d=MarketInfo(sy, MODE_DIGITS);
int dd=0, k=iBars(sy, tf);
if (n1>k || n2>k)
Print("GetPriceDiffInPoint(): Недостаточно баров для ",sy," ",GetNameTF(tf));
else {
if (n1>0 && n2>0) {
int d1=NormalizeDouble((iHigh(sy, tf, n1)-iLow(sy, tf, n2))/p, d);
int d2=NormalizeDouble((iLow(sy, tf, n1)-iHigh(sy, tf, n2))/p, d);
if (MathAbs(d1)>MathAbs(d2)) dd=d1;
if (MathAbs(d1)<MathAbs(d2)) dd=d2;
if (MathAbs(d1)==MathAbs(d2)) {
if (iOpen(sy, tf, n2)>iClose(sy, tf, n1)) dd=d2; else dd=d1;
}
}
}
return(dd);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 30.07.2008 |//| Описание : Возвращает флаг существования ордеров по цене установки |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//| pp - цена (-1 - любая цена) |//+----------------------------------------------------------------------------+bool ExistOrdersByPrice(string sy="", int op=-1, int mn=-1, double pp=-1) {
int d, 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 (OrderType()>1 && OrderType()<6) {
d=MarketInfo(OrderSymbol(), MODE_DIGITS);
pp=NormalizeDouble(pp, d);
if (pp<0 || pp==NormalizeDouble(OrderOpenPrice(), d)) {
if (mn<0 || OrderMagicNumber()==mn) return(True);
}
}
}
}
}
return(False);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 03.08.2008 |//| Описание : Рассчитывает количество ордеров по типам. |//+----------------------------------------------------------------------------+//| Параметры: |//| mo - массив количества ордеров по типам |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+void CountOrders(int& mo[], int mn=-1) {
int i, k=OrdersTotal();
if (ArraySize(mo)!=6) ArrayResize(mo, 6);
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (mn<0 || OrderMagicNumber()==mn) mo[OrderType()]++;
}
}
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 18.07.2008 |//| Описание : Возвращает одно из двух значений взависимости от условия. |//+----------------------------------------------------------------------------+color IIFc(bool condition, color ifTrue, color ifFalse) {
if (condition) return(ifTrue); elsereturn(ifFalse);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.02.2008 |//| Описание : Возвращает одно из двух значений взависимости от условия. |//+----------------------------------------------------------------------------+double IIFd(bool condition, double ifTrue, double ifFalse) {
if (condition) return(ifTrue); elsereturn(ifFalse);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.02.2008 |//| Описание : Возвращает одно из двух значений взависимости от условия. |//+----------------------------------------------------------------------------+int IIFi(bool condition, int ifTrue, int ifFalse) {
if (condition) return(ifTrue); elsereturn(ifFalse);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.02.2008 |//| Описание : Возвращает одно из двух значений взависимости от условия. |//+----------------------------------------------------------------------------+string IIFs(bool condition, string ifTrue, string ifFalse) {
if (condition) return(ifTrue); elsereturn(ifFalse);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 27.08.2008 |//| Описание : Возвращает флаг существования в истории позиции или ордера, |//| : закрытой (удалённого) между датами. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая операция) |//| mn - MagicNumber (-1 - любой магик) |//| d1 - время закрытия ( 0 - любое время закрытия) |//| d2 - время закрытия ( 0 - любое время закрытия) |//+----------------------------------------------------------------------------+bool ExistInHistoryCloseBetween(string sy="", int op=-1, int mn=-1,
datetime d1=0, datetime d2=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 (mn<0 || OrderMagicNumber()==mn) {
if (d1<=OrderCloseTime() && (d2==0 || d2>=OrderCloseTime())) return(True);
}
}
}
}
return(False);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 27.08.2008 |//| Описание : Возвращает флаг существования в истории позиции или ордера, |//| : открытой (установленного) между датами. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//| d1 - время открытия ( 0 - любое время открытия) |//| d2 - время открытия ( 0 - любое время открытия) |//+----------------------------------------------------------------------------+bool ExistInHistoryOpenBetween(string sy="", int op=-1, int mn=-1,
datetime d1=0, datetime d2=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 (mn<0 || OrderMagicNumber()==mn) {
if (d1<=OrderOpenTime() && (d2==0 || d2>=OrderOpenTime())) return(True);
}
}
}
}
return(False);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 06.08.2008 |//| Описание : Возвращает флаг наличия ордера или позиции в истории за сегодня|//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+bool ExistInHistoryToDay(string sy="", int op=-1, int mn=-1) {
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=="") {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (TimeDay (OrderOpenTime())==Day()
&& TimeMonth(OrderOpenTime())==Month()
&& TimeYear (OrderOpenTime())==Year()) return(True);
}
}
}
}
}
return(False);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 06.08.2008 |//| Описание : Возвращает цену TakeProfit последней открытой позиций или -1. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+double TakeProfitLastPos(string sy="", int op=-1, int mn=-1) {
datetime t;
double r=-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=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderOpenTime()) {
t=OrderOpenTime();
r=OrderTakeProfit();
}
}
}
}
}
}
}
return(r);
}
CorrectTF()関数。
この関数は、インジケータや EAの入力パラメータに、誤ったタイムフレーム(分単位の整数)を簡単に指定できることがあることを発見した後に書きました。例えば、時間給を60ではなく50と入力した。まあ...は、ちょっと寂しいですね。iRSI()関数が不正確な時間枠に対してゼロを返すことが判明しました。その他の機能については、チェックしていないので何とも言えません。私の不注意からくる誤解を避けるため、この機能は原始的なフールプルーフとして書きました。入力されたパラメータを最も近い適切な時間枠に調整し、その値を返します。
関数 DateBeginQuarter()。
この関数は、四半期の開始日をその番号で返します。例えば、現在が2008年8月27日であれば、当四半期の開始日は2008年7月1日となります。この関数が受け取るパラメータは1つだけで、それは現在の四半期を基準とした四半期番号です。例えば、0は 現在の四半期、1は 次の四半期、- 1は前の四半期を表します。つまり、正の四分の一の数字は未来の日付を要求し、0と負の数字は過去の日付を要求します。1970年1月1日00時00分からの経過秒数が返される。
DateOfMonday()関数を使用します。
この関数は、その週の開始日(月曜日)を番号で返します。例えば、現在が2008年8月29日であれば、現在の週の始まりの日付は2008年8月25日になります。この関数は、現在の週からの相対的な週数という1つのパラメータだけを受け取ります。例えば、0が 現在の週、1が 次の週、-1が 前の週です。つまり、正の週番号は未来の日付を要求し、0と負の週番号は過去の日付を要求する。戻り値は 1970 年 1 月 1 日 00:00 からの経過秒数である。
関数Fibonacci()です。
この関数は、フィボナッチ級数の要素をそのシーケンス番号で返します。
GetNameMA()関数。
この関数は、MA のメソッド名(移動平均)を識別子で返します。コメントやインジケーター、Expert Advisorのメッセージに使用すると便利な機能です。
GetPriceDiffInPoint()関数。
この関数は、番号で指定された 2 本のバーの価格差を返す。この機能を開発した目的は、値動きの価値と方向を判断することであった。GetPriceDiffInPoint()関数は、考慮するバーの基準点(OpenまたはHighまたはLowまたはClose)を決定します。この関数は、以下のオプションパラメータを受け付ける。
戻り値です。
GetTypePrice()関数
価格タイプの名称を返す。この関数は、オプションのパラメータを1つだけ受け取ります。有効な値:PRICE_CLOSE、PRICE_OPEN、PRICE_HIGH、PRICE_LOW、PRICE_MEDIAN、PRICE_TYPICAL、PRICE_WEIGHTED。 デフォルト値は0-PRICE_CLOSEです。
ArrayLR()関数です。
この関数は、線形回帰の値の配列を生成します。この関数は、以下の必須パラメータを受け付ける。
ArrayMo()関数。
Modu関数は、分布密度曲線の最大値を返します。この関数は、以下のオプションパラメータを受け付ける。
関数 ExistOrdersByPrice()。
与えられた設定価格での注文が存在するかどうかのフラグを返します。True- オーダーが存在する(設定されている)、False- オーダーが存在しない(設定されていない)。関数のパラメータを使用して、チェックする注文のリストを制限することができます。
テスターのClosePosBySelect()関数です。
あらかじめ選択された1つのポジションを閉じます。13ページ で紹介した同名の機能を簡略化したものです。 余分なものはありません。余分な機能はありません。私の実務では、テスターでクローズしなかったポジションはありません。そのため、この機能にはチェックがありません。テスターでは不要です。
テスター用のCountOrders()関数です。
私のテスト版(MT4のテスター専用)では、ExistOrders(),ExistPositions(),NumberOfOrders(),NumberOfPositions() という関数の代わりに、CountOrders() という関数を使って、任意のポジションや注文があるか、それぞれの種類の取引量が分かるようになっています。このような取引所には独自の利点があり、それは1ティックの注文ベースを1回参照するだけで、必要な情報を一度に取得できることに表れています。そして、上記の機能は、特に併用する場合、それぞれが独立して1つの同じオーダーベースで動作するため、同じ呼び出しを繰り返してしまいます。その結果、CountOrders() 関数は、1回のパスの時間を数秒短縮することができ、最適化の時間を短縮することができる。
関数CountOrders() は、以下のパラメータをとる。
テスターのModifyOrder()関数です。
これは、7ページで 公開したModifyOrder() 関数のライトバージョンで、あらかじめ選択した1つの注文またはポジションの絶対価格水準を変更するためのものです。
ModifyOrder() 関数は、以下のパラメータを受け付けます。
IIFc()関数です。
フォークの組み立てという点では非常に便利な機能です。だとしたら、この色。そして、そうでない場合は、別の色。関数IIFc()は3つの必須パラメータをとる。
IIFd()関数。
実数でも同様の利便性がある。もしそうなら、それは実数である。そうでない場合は、別の番号になります。IIFd() 関数は、3つの必須パラメータをとる。
IIFi()関数です。
整数の場合も同様の利便性があります。もしそうなら、それは整数である。そして、そうでない場合は、別の番号になります。IIFi() 関数は、3つの必須パラメータをとる。
IIFis()関数。
文字列についても同様の利便性があります。もしそうなら、そのような文字列。そして、そうでない場合は、別の文字列。IIFs() 関数は、3つの必須パラメータをとる。
ExistInHistoryCloseBetween()関数を使用します。
日付の間にクローズ(削除)されたポジションや注文が履歴に存在するかどうかのフラグを返します。関数ExistInHistoryCloseBetween() は、以下のパラメータを受け取る。
関数 ExistInHistoryOpenBetween()。
日付の間にオープン(設定)されたポジションまたはオーダーの履歴に存在するフラグを返します。関数ExistInHistoryOpenBetween() は、以下のパラメータを受け取る。
関数 ExistInHistoryToDay()。
本日オープン(設定)したポジションまたはオーダーの履歴の中の存在フラグを返します。関数ExistInHistoryToDay() は、以下のパラメータを受け取る。
TakeProfitLastPos()関数。
この関数は、最後のオープンポジションのTakeProfitの 価格レベルまたは-1を 返します。TakeProfitLastPos() 関数には、次のオプション・パラメータがあります。