//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 17.02.2012 |//| Описание : Возвращает суммарный потенциальный убыток |//| открытых позиций в валюте депозита. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+double GetPotentialLossInCurrency(string sy="", int op=-1, int mn=-1) {
double pl=0;
double po, tv; // Пункт, спрэд и стоимость пункта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=="") && (mn<0 || OrderMagicNumber()==mn)) {
if ((OrderType()==OP_BUY || OrderType()==OP_SELL) && (op<0 || OrderType()==op)) {
if (OrderStopLoss()>0) {
po=MarketInfo(OrderSymbol(), MODE_POINT);
if (po==0) Message("В обзоре рынка отсутствует символ "+OrderSymbol()+". Точность расчётов не гарантируется!");
else {
tv=MarketInfo(OrderSymbol(), MODE_TICKVALUE);
if (OrderType()==OP_BUY) {
pl+=(OrderOpenPrice()-OrderStopLoss())/po*OrderLots()*tv;
}
if (OrderType()==OP_SELL) {
pl+=(OrderStopLoss()-OrderOpenPrice())/po*OrderLots()*tv;
}
pl+=OrderCommission()+OrderSwap();
}
} else {
pl=AccountBalance();
break;
}
}
}
}
}
return(pl);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 29.02.2012 |//| Описание : Возвращает запас депозита в пунктах. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+int ReserveDepositInPoint(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal(); // Номера позицийint n, r; // Номер символа в массиве, запас депозита в пунктахdouble ol[], tv; // Массив лотов, стоимость пунктаstring os[]; // Массив символовif (sy=="0") sy=Symbol();
ArrayResize(os, 0);
ArrayResize(ol, 0);
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
n=ArraySearchString(os, OrderSymbol());
if (n<0) {
n=ArraySize(os);
ArrayResize(os, n+1);
ArrayResize(ol, n+1);
}
os[n]=OrderSymbol();
if ((op<0 || OrderType()==op) && (OrderType()==OP_BUY || OrderType()==OP_SELL)) {
if (OrderType()==OP_BUY ) ol[n]+=OrderLots();
if (OrderType()==OP_SELL) ol[n]-=OrderLots();
}
}
}
}
n=ArraySize(os);
for (i=0; i<n; i++) {
tv=MarketInfo(os[i], MODE_TICKVALUE);
if (tv==0) Message("В обзоре рынка отсутствует символ "+os[i]+". Точность расчётов не гарантируется!");
else {
if (ol[i]!=0) {
ol[i]=MathAbs(ol[i]);
r+=AccountEquity()/tv/ol[i];
}
}
}
if (n>1) r/=n*n;
return(r);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 14.03.2012 |//| Описание : Возвращает последнюю серию убыточных позиций |//| (количество подряд), закрытых с определённой даты. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//| dt - Дата и время в секундах с 1970 года ( 0 - с начала истории) |//+----------------------------------------------------------------------------+int NumberOfLastLossPosFromDate(string sy="", int op=-1, int mn=-1, datetime dt=0) {
int i, k=OrdersHistoryTotal(), kp=0;
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 (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (dt<OrderCloseTime()) {
if (OrderProfit()<0) kp++; else kp=0;
}
}
}
}
}
}
return(kp);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 20.03.2009 |//| Описание : Закрытие позиций по рыночной цене за исключением одной, |//| : с переданным тикетом. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//| ti - тикет позиции ( 0 - любой тикет) |//+----------------------------------------------------------------------------+void ClosePosExceptTicket(string sy="", int op=-1, int mn=-1, int ti=0) {
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=k-1; i>=0; 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) {
if (ti==0 || ti!=OrderTicket()) ClosePosBySelect();
}
}
}
}
}
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 30.04.2010 |//| Описание : Возвращает неторговое изменение баланса с определённой даты |//| (пополнения, снятия, внутренние переводы). |//+----------------------------------------------------------------------------+//| Параметры: |//| dt - Дата и время в секундах с 1970 года (0 - с начала истории) |//+----------------------------------------------------------------------------+double GetChangeBalance(datetime dt=0)
{
double p=0;
int i, k=OrdersHistoryTotal();
for (i=0; i<k; i++) {
if (OrderType()==6) {
if (dt<OrderCloseTime()) p+=OrderProfit();
}
}
return(p);
}
同じでもエクセルと連動するような(買う気満々の))ものはないのでしょうか?
いや、使えない...。)))
GetPotentialLossInCurrency()関数は、預入通貨における未決済ポジションの潜在的な損失の合計を返します。ポジションの開始価格とStopLossの価格レベルに基づいて計算されます。StopLossがどのポジションにも設定されていない場合、この関数は取引口座の現在の資本を返します。
GetPotentialLossInCurrency() 関数は、以下のパラメータを受け付けます。
GetPotentialLossInCurrency() 関数をテストするスクリプトを添付しています。
イゴールさん、こんにちは。非常に便利な機能の数々に拍手です。
ちょっとお伺い したいのですが... 部分的にロッカーのよう なものを作りたいのです。でも今のところ、どうアレンジしたらいいのかわからないんです。このような考え方です。
200$ -175$ -150$ と -25$ の4つの注文があり、5つ以上の注文で合計 +400$ とします。
400が-200+-175を超え、-200+-175+-150以下であれば、5つのプラスとマイナスの注文を閉じる -200 -175、それは損失の大きいか小さいかの2つの注文である。
この例はかなり粗雑ですが、アイデアは得られたと思います。
まず問題なのは、それらを書き留めるものが必要だということです。(Arrayがよくわからない) 、他の方法を探してみてください。
2番目の問題は、1番目の問題から導かれる。例えば 、4つの異なるオーダーからのロットで los[x]を得たとします。ロット( los[x] )を、価格に従ってtiketを検索するモジュールにロードすべき でしょうか?それとも、ロットをソートしながら1 (los[price] )と2 (los2[tiket])を追加 するのでしょうか?
もしかしたら、こんなことができるんだよと指南してくれたり、知らないことを教えてくれるかもしれません =)
おそらくすべてのトレーダーは遅かれ早かれ、保証金が失われる前に残りのpips数を計算し始めるでしょう。計算方法は簡単で、お金を取り、それを市場のロット数で割り、ポイント値で割れば、求めている答えが得られるのです。これはまさに私の新しい関数ReserveDepositInPoint() が行うことで、次のようなパラメータを取ります。
ReserveDepositInPoint() 関数は、反対売買のポジションを正しく処理します。つまり、売りと 買いの ロットの差を計算し、その差を正確に計算に使用します。計算は、エクイティ、すなわちストップアウトが100%であることを前提としています。スワップ、税金、手数料は考慮されていません。
ReserveDepositInPoint()関数を確認するExpert Advisorを添付して います。
関数 SetFibo()。
この関数は、OBJ_FIBO オブジェクトのフィボナッチレベルを現在のチャートに設定します。
GetLastThreeExtremumZZ()関数を使用します。
ジグザグの最後の3つの極値を検索し、その値(各極値のバー番号と価格レベル)を返します。このデータはすべて2次元配列に格納され、関数のパラメータとして渡される。以下は、関数のパラメータ全体のリストです。
GetLastThreeExtremumZZ() 関数をテストするためのスクリプトを添付しています。
NumberOfOrdersByPrice()関数を使用します。
指定された価格帯で設定された注文の数を返します。関数パラメータでチェックする注文のリストを制限することができます。
NumberOfLastLossPosFromDate()関数を使用します。
この関数は、ある日付以降に決済された最後の負けポジションのシリーズ(列の数)を返します。考慮すべき位置をより正確に選択するために、外部パラメータを使用して指定します。
ClosePosExceptTicket()関数です。
この関数は、渡されたチケットのポジションを除くすべてのポジションを成行で決済します。閉じるべき位置をより正確に選択するために、外部パラメータで指定します。
GetChangeBalance()関数。
パラメータとして渡された特定の日付からの非トレーディング(入金、出金、内部振替、利息発生、ボーナス) 残高の変化を返します。