Мне тут на днях для инфопанели понадобилась функция, которая вернула бы предполагаемую прибыль/убыток в валюте депозита при срабатывании стопов у группы позиций. Ну чё, не впервой ведь писать такие функции. Тестировал её долго и нудно в разных ДЦ и на разных инструментах с разными способами расчёта прибыли. Кто не знает, этих способов аж три: Forex, CFD и Futures. Я правда не смог обнаружить, чем отличаются Forexи Futures, но возможность расчёта по разному в код всё-таки заложил. Максимальный размер убытка, который может вернуть функция, искусственно ограничивается размером текущего баланса счёта. Традиционно в функцию можно передать параметры и таким образом отфильтровать нужные для анализа позиции:
sy - Наименование инструмента. Если задать этот параметр, то функция проверит позиции только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 - означает любую позицию.
mn - Идентификатор позиции (MagicNumber). Значение по умолчанию -1 - любой магик.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 03.05.2012 |//| Описание : Возвращает предполагаемую прибыль/убыток в валюте депозита |//| в случае срабатывания стопа открытых позиций. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ( "" - любой символ, |//| NULL - текущий символ) |//| op - операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) |//+----------------------------------------------------------------------------+double ProfitIFStopInCurrency(string sy="", int op=-1, int mn=-1) {
if (sy=="0") sy=Symbol(); // Текущий символint i, k=OrdersTotal(); // Подсчёт открытых позицийint m; // Способ расчета прибыли: 0 - Forex, 1 - CFD, 2 - Futuresdouble l; // Размер контракта в базовой валюте инструментаdouble p; // Размер пункта в валюте котировкиdouble t; // Минимальный шаг изменения цены инструмента в валюте котировкиdouble v; // Размер минимального изменения цены инструмента в валюте депозитаdouble s=0; // Подсчёт стопа в валюте депозита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)) {
l=MarketInfo(OrderSymbol(), MODE_LOTSIZE);
m=MarketInfo(OrderSymbol(), MODE_PROFITCALCMODE);
p=MarketInfo(OrderSymbol(), MODE_POINT);
t=MarketInfo(OrderSymbol(), MODE_TICKSIZE);
v=MarketInfo(OrderSymbol(), MODE_TICKVALUE);
if (OrderType()==OP_BUY) {
if (m==0) s-=(OrderOpenPrice()-OrderStopLoss())/p*v*OrderLots();
if (m==1) s-=(OrderOpenPrice()-OrderStopLoss())/p*v/t/l*OrderLots();
if (m==2) s-=(OrderOpenPrice()-OrderStopLoss())/p*v*OrderLots();
s+=OrderCommission()+OrderSwap();
}
if (OrderType()==OP_SELL) {
if (OrderStopLoss()>0) {
if (m==0) s-=(OrderStopLoss()-OrderOpenPrice())/p*v*OrderLots();
if (m==1) s-=(OrderStopLoss()-OrderOpenPrice())/p*v/t/l*OrderLots();
if (m==2) s-=(OrderStopLoss()-OrderOpenPrice())/p*v*OrderLots();
s+=OrderCommission()+OrderSwap();
} else s=-AccountBalance();
}
}
}
}
}
if (AccountBalance()+s<0) s=-AccountBalance(); // Ограничение убытка балансом счётаreturn(s);
}
ЗЫ. Во вложении скрипт для тестирования функции ProfitIFStopInCurrency().
Эта функция аналогична предыдущей, только возвращает предполагаемую прибыль/убыток в валюте депозита при срабатывании тейков у группы позиций. Также учтён способ расчёта прибыли: Forex, CFD и Futures. Максимальный размер прибыли, который может вернуть функция, искусственно ограничивается числом 999 999 999. Параметры:
sy - Наименование инструмента. Если задать этот параметр, то функция проверит позиции только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 - означает любую позицию.
mn - Идентификатор позиции (MagicNumber). Значение по умолчанию -1 - любой магик.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 03.05.2012 |//| Описание : Возвращает предполагаемую прибыль/убыток в валюте депозита |//| в случае срабатывания тейка открытых позиций. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ( "" - любой символ, |//| NULL - текущий символ) |//| op - операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) |//+----------------------------------------------------------------------------+double ProfitIFTakeInCurrency(string sy="", int op=-1, int mn=-1) {
if (sy=="0") sy=Symbol(); // Текущий символint i, k=OrdersTotal(); // Подсчёт открытых позицийint m; // Способ расчета прибыли: 0 - Forex, 1 - CFD, 2 - Futuresdouble l; // Размер контракта в базовой валюте инструментаdouble p; // Размер пункта в валюте котировкиdouble t; // Минимальный шаг изменения цены инструмента в валюте котировкиdouble v; // Размер минимального изменения цены инструмента в валюте депозитаdouble s=0; // Подсчёт стопа в валюте депозита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)) {
l=MarketInfo(OrderSymbol(), MODE_LOTSIZE);
m=MarketInfo(OrderSymbol(), MODE_PROFITCALCMODE);
p=MarketInfo(OrderSymbol(), MODE_POINT);
t=MarketInfo(OrderSymbol(), MODE_TICKSIZE);
v=MarketInfo(OrderSymbol(), MODE_TICKVALUE);
if (OrderType()==OP_BUY) {
if (OrderTakeProfit()>0) {
if (m==0) s+=(OrderTakeProfit()-OrderOpenPrice())/p*v*OrderLots();
if (m==1) s+=(OrderTakeProfit()-OrderOpenPrice())/p*v/t/l*OrderLots();
if (m==2) s+=(OrderTakeProfit()-OrderOpenPrice())/p*v*OrderLots();
s+=OrderCommission()+OrderSwap();
} else s=999999999;
}
if (OrderType()==OP_SELL) {
if (m==0) s+=(OrderOpenPrice()-OrderTakeProfit())/p*v*OrderLots();
if (m==1) s+=(OrderOpenPrice()-OrderTakeProfit())/p*v/t/l*OrderLots();
if (m==2) s+=(OrderOpenPrice()-OrderTakeProfit())/p*v*OrderLots();
s+=OrderCommission()+OrderSwap();
}
}
}
}
}
return(s);
}
ЗЫ. Во вложении скрипт для тестирования функции ProfitIFTakeInCurrency().
Здравствуйте! А нет ли у вас какого-то шаблона (для начинающих), чтобы проще было написать советник для тестера и для реальной торговли. Что-то дело не движется((((
Chuma: Здравствуйте! А нет ли у вас какого-то шаблона (для начинающих), чтобы проще было написать советник для тестера и для реальной торговли. Что-то дело не движется((((
Шаблон? :)) Дык берите любой мой советник в качестве отправной точки...
KimIV: Шаблон? :)) Дык берите любой мой советник в качестве отправной точки...
Спасибо.... вобщем-то вещи интересные и полезные.... но я пока планирую создать торгующий советник, который бы открывал и закрывал позиции по самым простым сигналам (пересечение средних к примеру) для начала, только все эти проверки, определение лота и.т.п.... что, когда и как... сложновато....
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Подскажите пожалуйста, для чего в строке return(StrToTime(ye+"."+mo+".01")) стоят плюсы.
Функция ProfitIFStopInCurrency()
Мне тут на днях для инфопанели понадобилась функция, которая вернула бы предполагаемую прибыль/убыток в валюте депозита при срабатывании стопов у группы позиций. Ну чё, не впервой ведь писать такие функции. Тестировал её долго и нудно в разных ДЦ и на разных инструментах с разными способами расчёта прибыли. Кто не знает, этих способов аж три: Forex, CFD и Futures. Я правда не смог обнаружить, чем отличаются Forex и Futures, но возможность расчёта по разному в код всё-таки заложил. Максимальный размер убытка, который может вернуть функция, искусственно ограничивается размером текущего баланса счёта. Традиционно в функцию можно передать параметры и таким образом отфильтровать нужные для анализа позиции:
ЗЫ. Во вложении скрипт для тестирования функции ProfitIFStopInCurrency().
Функция ProfitIFTakeInCurrency()
Эта функция аналогична предыдущей, только возвращает предполагаемую прибыль/убыток в валюте депозита при срабатывании тейков у группы позиций. Также учтён способ расчёта прибыли: Forex, CFD и Futures. Максимальный размер прибыли, который может вернуть функция, искусственно ограничивается числом 999 999 999. Параметры:
ЗЫ. Во вложении скрипт для тестирования функции ProfitIFTakeInCurrency().
Здравствуйте! А нет ли у вас какого-то шаблона (для начинающих), чтобы проще было написать советник для тестера и для реальной торговли. Что-то дело не движется((((
Шаблон? :)) Дык берите любой мой советник в качестве отправной точки...
Спасибо.... вобщем-то вещи интересные и полезные.... но я пока планирую создать торгующий советник, который бы открывал и закрывал позиции по самым простым сигналам (пересечение средних к примеру) для начала, только все эти проверки, определение лота и.т.п.... что, когда и как... сложновато....
Игорь, я извиняюсь за свои частые вопросы, и очень надеюсь, что это не слишком для Вас затруднительно..... Скажите пожалуйста, что означает
gbDisabledв функции OpenPosition() для online
вот часть кода:
при компилировании выдает ошибку, что переменная not defined.