не сдвинется тележка...
потому что это не тележка, а ТЕЛЕГА. К тому же на ручнике стоИт...
Попытка благородная, конечно... я тоже когда-то пробовал.
Но тот, кто захочет качества, сделает сам (или закажет за деньги), а остальным это не поможет.
потому что это не тележка, а ТЕЛЕГА. К тому же на ручнике стоИт...
Попытка благородная, конечно... я тоже когда-то пробовал.
Но тот, кто захочет качества, сделает сам (или закажет за деньги), а остальным это не поможет.
А вот тут сразу попутно вопрос. Когда один из советников завис в Слипе, как для других в это время откликается IsTradeAllowed( )? Если истинно, то надо вторично запрашивать на торговлю, а если ложь, то может создасться ситуация, когда не дашь другим торговать.
Типа, мои три рубля в общую копилку.
//+------------------------------------------------------------------+ //| b-TradeForReal.mqh | //| Ким Игорь В. aka KimIV | //| http://www.kimiv.ru | //| | //| 01.12.2005 v.0.0. Библиотека торговых функций для реала | //| CloseAllPositions() - Закрытие всех позиций по рыночной цене | //| ExistPosition() - Возвращает флаг существования позиции | //| ModifyStopLoss() - Перенос уровня StopLoss | //| ModifyTakeProfit() - Перенос уровня TakeProfit | //| SetOrder() - Установка ордера или открытие позиции | //| GetCommentForOrder() - Возвращает комментарий для ордера | //+------------------------------------------------------------------+ //+------ Необходимые глобальные переменные -------------------------- //int NumberOfTry = 9; // Количество попыток //int PauseAfterError = 45; // Пауза после ошибки в секундах //string Name_Expert = ""; //bool UseSound = False; //string NameFileSound = "expert.wav"; //+------------------------------------------------------------------+ //| Закрытие всех позиций по рыночной цене | //+------------------------------------------------------------------+ void CloseAllPositions() { bool fc; int err, it; for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) { fc=False; for (it=0; it<NumberOfTry; it++) { while (!IsTradeAllowed()) Sleep(5000); if (OrderType()==OP_BUY) { fc=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy); if (fc) { if (UseSound) PlaySound(NameFileSound); break; } else { err=GetLastError(); Print("Error(",err,") closing order: ",ErrorDescription(err),", try ",it); Sleep(1000*PauseAfterError); } } if (OrderType()==OP_SELL) { fc=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell); if (fc) { if (UseSound) PlaySound(NameFileSound); break; } else { err=GetLastError(); Print("Error(",err,") closing order: ",ErrorDescription(err),", try ",it); Sleep(1000*PauseAfterError); } } } } } } } //+------------------------------------------------------------------+ //| Возвращает флаг существования позиции | //+------------------------------------------------------------------+ bool ExistPosition() { bool Exist=False; for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { Exist=True; break; } } } } return(Exist); } //+------------------------------------------------------------------+ //| Перенос уровня StopLoss | //| Параметры: | //| ldStop - уровень StopLoss | //| lcColor - цвет | //+------------------------------------------------------------------+ void ModifyStopLoss(double ldStop, color lcColor) { bool fm; double ldOpen=OrderOpenPrice(); double ldTake=OrderTakeProfit(); int err, it; for (it=1; it<=NumberOfTry; it++) { while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); fm=OrderModify(OrderTicket(), ldOpen, ldStop, ldTake, 0, clModify); if (fm) { if (UseSound) PlaySound(NameFileSound); break; } else { err=GetLastError(); Print("Error(",err,") modifying StopLoss: ",ErrorDescription(err),", try ",it); Sleep(1000*PauseAfterError); } } } //+------------------------------------------------------------------+ //| Перенос уровня TakeProfit | //| Параметры: | //| ldTake - уровень TakeProfit | //| lcColor - цвет | //+------------------------------------------------------------------+ void ModifyTakeProfit(double ldTake, color lcColor) { bool fm; double ldOpen=OrderOpenPrice(); double ldStop=OrderStopLoss(); int err, it; for (it=1; it<=NumberOfTry; it++) { while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); fm=OrderModify(OrderTicket(), ldOpen, ldStop, ldTake, 0, clModify); if (fm) { if (fm && UseSound) PlaySound(NameFileSound); break; } else { err=GetLastError(); Print("Error(",err,") modifying TakeProfit: ",ErrorDescription(err),", try ",it); Sleep(1000*PauseAfterError); } } } //+------------------------------------------------------------------+ //| Установка ордера или открытие позиции | //| Параметры: | //| op - операция | //| pp - цена | //| ldStop - уровень стоп | //| ldTake - уровень тейк | //+------------------------------------------------------------------+ void SetOrder(int op, double pp, double ldStop, double ldTake) { color clOpen; int err, it, ticket; string lsComm=GetCommentForOrder(); if (op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell; for (it=0; it<NumberOfTry; it++) { while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); ticket=OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,MAGIC,0,clOpen); if (ticket>0) { if (UseSound) PlaySound(NameFileSound); break; } else { err=GetLastError(); Print("Error(",err,") opening order: ",ErrorDescription(err),", try ",it); Sleep(1000*PauseAfterError); } } } //+------------------------------------------------------------------+ //| Генерирует и возвращает строку коментария для ордера или позиции | //+------------------------------------------------------------------+ string GetCommentForOrder() { return(Name_Expert+" "+GetNameTF(Period())); } //+------------------------------------------------------------------+
KimIV,
можно ли немного комментариев, как это работает?
Сначала исполняется OrderSend(), потом советник затряет на неопредлённое время (пока ф-ия не вернёт какое-то значение), потом это значение присваивается переменной ticket. Так?
Меня интересует развитие событий в период застревания. Мы просто тупо ждём? И нет возможности стронуться с места? Такое свойство ф-ии OrderSend()?
можно ли немного комментариев, как это работает?
Сначала исполняется OrderSend(), потом советник затряет на неопредлённое время (пока ф-ия не вернёт какое-то значение), потом это значение присваивается переменной ticket. Так?
Меня интересует развитие событий в период застревания. Мы просто тупо ждём? И нет возможности стронуться с места? Такое свойство ф-ии OrderSend()?
ticket=OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,MAGIC,0,clOpen);
to SK
Может быть Вы имели в виду застревание здесь
while (!IsTradeAllowed()) Sleep(5000);
В других местах больше ничего и нигде застрять не может. А в вышеуказанном цикле у меня пока ни разу не застревало. Застрянет, придумаю что-нибудь. Например, что-нить типа этого
for (it=0; it<NumberOfTry; it++)
Может быть Вы имели в виду застревание здесь
while (!IsTradeAllowed()) Sleep(5000);
В других местах больше ничего и нигде застрять не может. А в вышеуказанном цикле у меня пока ни разу не застревало. Застрянет, придумаю что-нибудь. Например, что-нить типа этого
for (it=0; it<NumberOfTry; it++)
KimIV,
Спасибо за ответ.
У меня пока не столько опыта в MQL4, сколько мне хотелось бы, поэтому я и спрашиваю.
Говоря "застряёт" я имел ввиду уточнить подробности работы кода по шагам.
Как будет исполняться эта строка кода?
1. Выполнится ф-ия OrderSend(), т.е сформируется и будет отправлен на сервер управляющий сигнал на открытие ордера.
2. Советник попытается выполнить оператор присваивания ticket=OrderSend(...).
По моим представлениям, не тут-то было, поскольку OrderSend() ещё (по крайней мере некоторое конечное время) не получил своё значение, каковое значение (опять же по мои представлениям) он может быть когда-нибудь получит, если сервер вернёт ему ответ некоторого содержания.
3. И только теперь может быть исполнен оператор присваивания.
Прошу, если Вы знаете и понимаете такие подробности, проясните мне этот вопрос.
Что происходит с советником в период, когда он уже отправил сигнал на сервер, но ещё не получил никакого ответа? Правильно ли полагать, что он "застрял", т.е. ждёт ответа..?
(и если не против, можно на "ты")
Спасибо за ответ.
У меня пока не столько опыта в MQL4, сколько мне хотелось бы, поэтому я и спрашиваю.
Говоря "застряёт" я имел ввиду уточнить подробности работы кода по шагам.
Как будет исполняться эта строка кода?
1. Выполнится ф-ия OrderSend(), т.е сформируется и будет отправлен на сервер управляющий сигнал на открытие ордера.
2. Советник попытается выполнить оператор присваивания ticket=OrderSend(...).
По моим представлениям, не тут-то было, поскольку OrderSend() ещё (по крайней мере некоторое конечное время) не получил своё значение, каковое значение (опять же по мои представлениям) он может быть когда-нибудь получит, если сервер вернёт ему ответ некоторого содержания.
3. И только теперь может быть исполнен оператор присваивания.
Прошу, если Вы знаете и понимаете такие подробности, проясните мне этот вопрос.
Что происходит с советником в период, когда он уже отправил сигнал на сервер, но ещё не получил никакого ответа? Правильно ли полагать, что он "застрял", т.е. ждёт ответа..?
(и если не против, можно на "ты")
Я думаю так же, как komposter, хотя специальных экспериментов не проводил. 100%-ной уверенности нет, как и потребности выяснять эти подробности.
komposter,
спасибо!:) Оч. хорошо.
А теперь: Что можно сказать о времени начала выполнения оператора, следующего за OrderSend() (в данном случае а=1), если OrderSend() выполняется без присваивания? Он тоже будет "ждать" отклик сервера или ждать не будет, а сразу исполнится?
OrderSend (...);
а=1;
спасибо!:) Оч. хорошо.
А теперь: Что можно сказать о времени начала выполнения оператора, следующего за OrderSend() (в данном случае а=1), если OrderSend() выполняется без присваивания? Он тоже будет "ждать" отклик сервера или ждать не будет, а сразу исполнится?
OrderSend (...);
а=1;
KimIV,
В твоём коде, пожалуй, нет.
У меня такая потребность есть. Мой скрипт будет управлять несколькими ордерами одновременно, я бы хотел написать корректный код, кот. давал бы возможность высвободить время для управления другими ордерами( например, исполнить подтяжку), не дожидаясь исполнения текущего открытия.
как и потребности выяснять эти подробности
В твоём коде, пожалуй, нет.
У меня такая потребность есть. Мой скрипт будет управлять несколькими ордерами одновременно, я бы хотел написать корректный код, кот. давал бы возможность высвободить время для управления другими ордерами( например, исполнить подтяжку), не дожидаясь исполнения текущего открытия.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Первый вариант: