ponochka: Здраствуйте! Помогите сделать следующее: Надо сделать целевую прибыль для каждой открытой позиции в рынке, но не общую, а отдельную! пример: открылся EURUSD и у него в настройках стоит целевая прибыль 1$ и как только она достигла ее, то позиция сама закрылась, только она! и так каждая валютная пара должна работать сама по себе, а не по общему профиту!
Код общего профита по всем парам я нашла: помогите переделать для каждой валютной пары отдельно......Заранее благодарна!
Если покопаться, можно и это найти.
//+----------------------------------------------------------------------------+//| e-CloseByProfitPosInCurrency.mq4 |//| |//| Ким Игорь В. aka KimIV |//| http://www.kimiv.ru |//| |//| 22.04.2008 Советник закрывает только те позиции, у которых профит |//| в валюте депозита превысил некоторое заданное значение. |//+----------------------------------------------------------------------------+#property copyright"Ким Игорь В. aka KimIV"#property link"http://www.kimiv.ru"//------- Внешние параметры советника -----------------------------------------+string _P_Expert = "---------- Параметры советника";
externint NumberAccount = 0; // Номер торгового счётаexternstring symbol = ""; // Торговый инструмент// "" - любой// "0" - текущийexternint Operation = -1; // Торговая операция:// -1 - любая// 0 - OP_BUY// 1 - OP_SELLexterndouble Profit = 50; // Профит в валюте депозитаexternint MagicNumber = 0; // MagicNumberexternbool ShowComment = True; // Показывать комментарий//------- Глобальные переменные советника -------------------------------------+bool gbNoInit = False; // Флаг неудачной инициализацииint Slippage = 3; // Проскальзывание ценыint NumberOfTry = 5; // Количество торговых попытокbool UseSound = True; // Использовать звуковой сигналstring NameFileSound = "expert.wav"; // Наименование звукового файлаcolor clCloseBuy = Blue; // Цвет значка закрытия покупкиcolor clCloseSell = Red; // Цвет значка закрытия продажи//------- Подключение внешних модулей -----------------------------------------+#include <stdlib.mqh> // Стандартная библиотека//+----------------------------------------------------------------------------+//| |//| ПРЕДОПРЕДЕЛЁННЫЕ ФУНКЦИИ |//| |//+----------------------------------------------------------------------------+//| expert initialization function |//+----------------------------------------------------------------------------+void init() {
gbNoInit = False;
if (!IsTradeAllowed()) {
Message("Для нормальной работы советника необходимо\n"+
"Разрешить советнику торговать");
gbNoInit=True; return;
}
if (!IsLibrariesAllowed()) {
Message("Для нормальной работы советника необходимо\n"+
"Разрешить импорт из внешних экспертов");
gbNoInit=True; return;
}
if (Operation<-1 || Operation>1) {
Message("Недопустимое значение внешнего параметра Operation");
gbNoInit=True; return;
}
if (symbol!="0" && symbol!="") {
if (MarketInfo(StringUpper(symbol), MODE_BID)==0) {
Message("В обзоре рынка отсутствует символ "+symbol);
gbNoInit=True; return;
}
}
if (!IsTesting()) {
if (IsExpertEnabled()) Message("Советник будет запущен следующим тиком");
else Message("Отжата кнопка \"Разрешить запуск советников\"");
}
}
//+----------------------------------------------------------------------------+//| expert deinitialization function |//+----------------------------------------------------------------------------+void deinit() { if (!IsTesting()) Comment(""); }
//+----------------------------------------------------------------------------+//| expert start function |//+----------------------------------------------------------------------------+void start() {
if (gbNoInit) {
Comment("Не удалось инициализировать советник!"); return;
}
if (!IsTesting()) {
if (NumberAccount>0 && NumberAccount!=AccountNumber()) {
Comment("Работа на счёте: "+AccountNumber()+" ЗАПРЕЩЕНА!");
return;
} elseComment("");
if (ShowComment) {
string st="NumberAccount="+DoubleToStr(NumberAccount, 0)
+" Symbol="+IIFs(symbol=="0", "All", IIFs(symbol=="", Symbol(), StringUpper(symbol)))
+" Operation="+IIFs(Operation<0, "All", GetNameOP(Operation))
+" Profit="+DoubleToStr(Profit, 2)+" "+AccountCurrency()
+" MagicNumber="+DoubleToStr(MagicNumber, 0)
+IIFs(ShowComment, " ShowComment", "")
;
Comment(st);
} elseComment("");
}
ClosePosBySizeProfitInCurrency(StringUpper(symbol), Operation, MagicNumber, Profit);
}
//+----------------------------------------------------------------------------+//| |//| ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ |//| |//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание: Закрытие одной предварительно выбранной позиции |//+----------------------------------------------------------------------------+void ClosePosBySelect() {
bool fc;
color clClose;
double ll, pa, pb, pp;
int err, it;
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
for (it=1; it<=NumberOfTry; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
if (OrderType()==OP_BUY) {
pp=pb; clClose=clCloseBuy;
} else {
pp=pa; clClose=clCloseSell;
}
ll=OrderLots();
fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
if (fc) {
if (UseSound) PlaySound(NameFileSound); break;
} else {
err=GetLastError();
if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
ErrorDescription(err),", try ",it);
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp);
Print("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(),
" tp=",OrderTakeProfit()," mn=",OrderMagicNumber());
Sleep(1000*5);
}
}
} elsePrint("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Закрытие тех позиций, у которых профит в валюте депозита |//| превысил некоторое значение |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//| pr - профит |//+----------------------------------------------------------------------------+void ClosePosBySizeProfitInCurrency(string sy="", int op=-1, int mn=-1, double pr=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 (OrderProfit()+OrderSwap()>pr) ClosePosBySelect();
}
}
}
}
}
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.09.2005 |//| Описание : Возвращает наименование торговой операции |//+----------------------------------------------------------------------------+//| Параметры: |//| op - идентификатор торговой операции |//+----------------------------------------------------------------------------+string GetNameOP(int op) {
switch (op) {
case OP_BUY : return("Buy");
case OP_SELL : return("Sell");
case OP_BUYLIMIT : return("Buy Limit");
case OP_SELLLIMIT: return("Sell Limit");
case OP_BUYSTOP : return("Buy Stop");
case OP_SELLSTOP : return("Sell Stop");
default : return("Unknown Operation");
}
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. 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 |//+----------------------------------------------------------------------------+//| Версия : 01.09.2005 |//| Описание : Вывод сообщения в коммент и в журнал |//+----------------------------------------------------------------------------+//| Параметры: |//| m - текст сообщения |//+----------------------------------------------------------------------------+void Message(string m) {
Comment(m);
if (StringLen(m)>0) Print(m);
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.09.2005 |//| Описание : Возвращает строку в ВЕРХНЕМ регистре |//+----------------------------------------------------------------------------+string StringUpper(string s) {
int c, i, k=StringLen(s), n;
for (i=0; i<k; i++) {
n=0;
c=StringGetChar(s, i);
if (c>96 && c<123) n=c-32; // a-z -> A-Zif (c>223 && c<256) n=c-32; // а-я -> А-Яif (c==184) n=168; // ё -> Ёif (n>0) s=StringSetChar(s, i, n);
}
return(s);
}
//+----------------------------------------------------------------------------+
Здравствуйте. Кто-нибудь, объясните неучу, почему функция
double iOpen( stringsymbol, // символ inttimeframe, // период intshift // сдвиг );
если я вставляю символьное имя инструмента, как сказано в справочнике,(а не 0 и не NULL) и запускаю в тестере на график, мне выдается ответ 0.0? При этом 0 и NULL выдают правильные значения. Спасибо.
novichok2018: Здравствуйте. Кто-нибудь, объясните неучу, почему функция
double iOpen( stringsymbol, // символ inttimeframe, // период intshift // сдвиг );
если я вставляю символьное имя инструмента, как сказано в справочнике,(а не 0 и не NULL) и запускаю в тестере на график, мне выдается ответ 0.0? При этом 0 и NULL выдают правильные значения. Спасибо.
Ой, извините, невнимателен: просто в имени инструмента пропустил одну буковку. Все нормально - неуч есть неуч.
Ой, извините, невнимателен: просто в имени инструмента пропустил одну буковку. Все нормально - неуч есть неуч.
А теперь возник другой вопрос: почему double DJop1 = iOpen("DowJones30",PERIOD_H1,1), запущенная на другом инструменте (не DowJones30) выдает правильные значения, а double DJbid = MarketInfo("DowJones30",MODE_BID) выдает 0.0, хотя на DowJones30 работает нормально?
Здраствуйте! Помогите сделать следующее:
Надо сделать целевую прибыль для каждой открытой позиции в рынке, но не общую, а отдельную!
пример: открылся EURUSD и у него в настройках стоит целевая прибыль 1$ и как только она достигла ее, то позиция сама закрылась, только она!
и так каждая валютная пара должна работать сама по себе, а не по общему профиту!
Код общего профита по всем парам я нашла:
помогите переделать для каждой валютной пары отдельно......Заранее благодарна!
Если покопаться, можно и это найти.
double iOpen(
string symbol, // символ
int timeframe, // период
int shift // сдвиг
);
если я вставляю символьное имя инструмента, как сказано в справочнике,(а не 0 и не NULL) и запускаю в тестере на график, мне выдается ответ 0.0? При этом 0 и NULL выдают правильные значения. Спасибо.
Здравствуйте. Кто-нибудь, объясните неучу, почему функция
double iOpen(
string symbol, // символ
int timeframe, // период
int shift // сдвиг
);
если я вставляю символьное имя инструмента, как сказано в справочнике,(а не 0 и не NULL) и запускаю в тестере на график, мне выдается ответ 0.0? При этом 0 и NULL выдают правильные значения. Спасибо.
Ой, извините, невнимателен: просто в имени инструмента пропустил одну буковку. Все нормально - неуч есть неуч.
Ой, извините, невнимателен: просто в имени инструмента пропустил одну буковку. Все нормально - неуч есть неуч.
А теперь возник другой вопрос: почему double DJop1 = iOpen("DowJones30",PERIOD_H1,1), запущенная на другом инструменте (не DowJones30) выдает правильные значения, а double DJbid = MarketInfo("DowJones30",MODE_BID) выдает 0.0, хотя на DowJones30 работает нормально?
Спасибо, что то непонятно, сейчас позиция в плюсе, но пишет 0.25.
Спасибо, что то непонятно, сейчас позиция в плюсе, но пишет 0.25.
Так ведь правильно, посчитайте .
Кто может помочь с этим вопросом https://www.mql5.com/ru/forum/160683/page897#comment_12221175?
Кто может помочь с этим вопросом https://www.mql5.com/ru/forum/160683/page897#comment_12221175?
2019.06.27 14:20:36.265 test EURUSD,H1: MyStructDouble.val = 123.456 , MyStructDouble.ind = 123
2019.06.27 14:20:35.700 test EURUSD,H1: MyStructDouble.val = 123.456 , MyStructDouble.ind = 123
2019.06.27 14:20:35.427 test EURUSD,H1: MyStructDouble.val = 123.456 , MyStructDouble.ind = 123
2019.06.27 14:20:34.758 test EURUSD,H1: initialized
т.е. несмотря на применение шаблона всё равно нужно присвоить тип
A<double> MyStructDouble;А с классами как будет выглядеть такой код, применить шаблон к классу.
т.е. несмотря на применение шаблона всё равно нужно присвоить тип
А с классами как будет выглядеть такой код, применить шаблон к классу.
С++ взят за основу в MQL, все Си подобные языки строго типизированные - гугл в помощь
один в один как мой пример, замените struct на class