Форум » Консультации по программированию » Помогите еще раз дорогой мастер?! » Ответить

Помогите еще раз дорогой мастер?!

Husanboy: Добрый день уважаемый Игорь! Я еще к вам по просьбу. Короче, есть индикатор корреляции и его коде использован формулу типа FastMA - SlowMA, но я хотел изменить его на FastMA / SlowMA. Сам попробовал но ни как не получилось(в принципе похоже элементарно легкий но у меня не получилось). Пожалуйста, покажите как заменит формулу?! Вот индикатор: http://file.qip.ru/arch/ZHX5cSTK/Correlations.html или http://qclk.ru/kF/Rm2b

Ответов - 61, стр: 1 2 3 4 5 All

Scriptong: Во-первых, в индикаторе не предусмотрена проверка на элементарные ошибки - деление на ноль. В итоге при запуске, когда не открыты соответствующие графики, индикатор завершается аварийно. Для предотвращения ошибки необходимо переписать код в блоке, следующем после if(ModeXPrice) так: double denom1 = iClose(Symbol1Name,0,1); double denom2 = iClose(Symbol2Name,0,1); double denom3 = iClose(Symbol3Name,0,1); if (denom1 == 0 || denom2 == 0 || denom3 == 0) return (0); kPrice1=1/denom1*iClose(Symbol1Name,0,1); kPrice2=1/denom2*iClose(Symbol1Name,0,1); kPrice3=1/denom3*iClose(Symbol1Name,0,1); Во-вторых, сами данные индикатор выдает очень неоднозначно, т. к. коэффициент "корреляции" между парами вычисляется на основании последней известной свечи каждого из символов. Получаем, что показания индикатора будут зависеть от момента его первого запуска. Так, запустив его в один момент времени, получим одну картину, в другой момент времени - другую. Причем в процессе работы индикатор изменять свои исторические показания не будет. Это очень странный алгоритм. Для изменения формулы необходимо знак "-" при МА заменить на знак "/". Только не забыть перед этим осуществить проверку деления на ноль следующим образом: double ma1 = iMA(Symbol1Name,Period(),MASlow,0,MAMethod,MAPrice,i); double ma2 = iMA(Symbol2Name,Period(),MASlow,0,MAMethod,MAPrice,i); double ma3 = iMA(Symbol3Name,Period(),MASlow,0,MAMethod,MAPrice,i); if (ma1 == 0 || ma2 == 0 || ma3 == 0) continue; Этот код нужно вставить сразу в начале цикла. Задуманное изменение формулы ни к чему хорошему не приведет. На экране будут отображены лишь горизонтальные линии, т. к. величина значений разных линий отличается на порядки.

Husanboy: Scriptong пишет: Спасибо большое, очень понятно и ясно!!!

Scriptong: Пожалуйста. Обращайтесь.


Husanboy: Scriptong пишет: Пожалуйста. Обращайтесь. Добрый вечер мой дорогой преподаватель! Еще к вам по просьбами обращаю. Пробовал написать советник работающие по мартингейлу, но не получилось корректировать порядочности открывание ордеры. Правила стратегии советника такого: Откроется 1 ордер на продажу с SL 10 и TP 10 пункта. Если сработал TP, тогда повторяется первый шаг. Если сработал SL, тогда откроем противоположный ордер(покупка) с SL 20 и TP 20 пунктам. Если сработал опять SL, теперь откроем тоже противоположный ордер(продажа) с SL 30 и TP 30 пунктам. Этот цикл продолжается до срабатывание TP и потом повторяется первый шаг. Здесь проблема только с открывание противоположный ордеры после стоп лосса и повторение первый шаг после тейкпрофита. Пожалуйста, помогите с кодом?! Заранее спасибо большое!!! Вот и сам советник: http://qclk.ru/k6/57gs или http://file.qip.ru/arch/ZxPS-Tfc/EA.html

Scriptong: Добрый вечер. В Вашем коде есть такие замечательные функции, как FindLastHistoryOrderParameter и ей подобные. Но тем не менее, в коде Вы повторяете их функционал. Зачем? Всего то нужно: 1. Определить величину профита последнего ордера в истории. Это лучше сделать через тикет: int lastTicket = FindLastHistoryOrderParameter(MAGIC_NUM, "ticket"); if (!OrderSelect(lastTicket, SELECT_BY_TICKET)) return 0; 2. Если профит положительный, то открыть ордер с SL 10 и TP 10. if (OrderProfit > 0) { OrderSend(Symbol(), <тип ордера>, FixedLots, Bid, Slippage* PipValue, <10 пп. стопа>, <10 пп. профита>, NameEA + CurTime(),MAGIC_NUM, 0, Red); } 3. Если профит отрицательный, то посмотреть, какой размер профита/стопа был у последнего закрытого ордера. К этой величине добавить 10 и открыть новый ордер. else { double slSize = MathAbs(OrderStopLoss() - OrderOpenPrice()) + 10 * Point; double tpSize = slSize; Sloss = Bid <или Ask> + <или -> slSize; Tprof = Bid <или Ask> + <или -> tpSize; OrderSend(...); } Вот и все.

Husanboy: Спасибо большое, но почему то не работает?! Там проблема не с ТП или СЛ, а открытие противоположный ордеры по очереди(если сработал СЛ продажу тогда открываем покупку). Сделал так: //----------------------------------------------------------------------------------------------------------------------------// int lastTicket = FindLastHistoryOrderParameter(MAGIC_NUM, "ticket"); if (!OrderSelect(lastTicket, SELECT_BY_TICKET)) return 0; if (OrderProfit() > 0 && StartWithBuy ) { if(StopLoss == 0){Sloss = 0;} else{ Sloss = Ask - 10* PipValue * Point;} if(TakeProfit == 0){Tprof = 0;}else{ Tprof = Bid + 10* PipValue * Point;} int Tiket= OrderSend(Symbol(), OP_BUY, FixedLots, Ask, Slippage* PipValue, Sloss, Tprof, NameEA + CurTime(),MAGIC_NUM, 0, Green); prtAlert("Buying");OrderTime=Time[0]; } else if(OrderType()==OP_BUY) { double slSize = MathAbs(OrderStopLoss() - OrderOpenPrice()) + 10 * Point* PipValue; double tpSize = slSize; Sloss = Bid + slSize; Tprof = Ask - tpSize; Tiket= OrderSend(Symbol(), OP_SELL, FixedLots, Ask, Slippage* PipValue, Sloss, Tprof, NameEA + CurTime(),MAGIC_NUM, 0, Green); prtAlert("Buying"); } if (OrderProfit() > 0 && StartWithSell ) { if(StopLoss == 0){Sloss = 0;}else{ Sloss = Bid + 10 * PipValue* Point;} if(TakeProfit == 0){Tprof = 0;}else{ Tprof = Ask - 10 * PipValue* Point;} Tiket= OrderSend(Symbol(), OP_SELL, FixedLots, Bid, Slippage* PipValue, Sloss, Tprof, NameEA + CurTime(),MAGIC_NUM, 0, Red); prtAlert("Selling");OrderTime=Time[0]; } else if(OrderType()==OP_BUY) { slSize = MathAbs(OrderStopLoss() - OrderOpenPrice()) + 10 * Point* PipValue; tpSize = slSize; Sloss = Ask - slSize; Tprof = Bid + tpSize; Tiket= OrderSend(Symbol(), OP_BUY, FixedLots, Ask, Slippage* PipValue, Sloss, Tprof, NameEA + CurTime(),MAGIC_NUM, 0, Green); prtAlert("Buying"); }

Scriptong: Husanboy пишет: Там проблема не с ТП или СЛ, а открытие противоположный ордеры по очереди(если сработал СЛ продажу тогда открываем покупку). Вместе с проверкой прибыльности Вы зачем-то проверяете значение параметра StartWithBuy. Для какой цели? Ведь нужно проверять тип закрытого ордера, и открывать противоположный ему: if (OrderProfit > 0) { if (StartWithBuy) { // открыть Buy с профитом/стопом 10 } else { // открыть Sell с профитом/стопом 10 } } else { if (OrderType() == OP_BUY) { // открыть Sell с увеличенными профитом/стопом } else { // открыть Buy с увеличенными профитом/стопом } }

Husanboy: Scriptong пишет: Вместе с проверкой прибыльности Вы зачем-то проверяете значение параметра StartWithBuy. Для какой цели? Ведь нужно проверять тип закрытого ордера, и открывать противоположный ему: цитата: if (OrderProfit > 0) { if (StartWithBuy) { // открыть Buy с профитом/стопом 10 } else { // открыть Sell с профитом/стопом 10 } } else { if (OrderType() == OP_BUY) { // открыть Sell с увеличенными профитом/стопом } else { // открыть Buy с увеличенными профитом/стопом } } Извиняюсь?! Опять не получилось(не откроется ни какого ордера)! //----------------------------------------------------------------------------------------------------------------------------// int lastTicket = FindLastHistoryOrderParameter(MAGIC_NUM, "ticket"); if (!OrderSelect(lastTicket, SELECT_BY_TICKET)) { if (OrderProfit() > 0 ) { if(StartWithBuy) { if(StopLoss == 0){Sloss = 0;} else{ Sloss = Ask - 10* PipValue * Point;} if(TakeProfit == 0){Tprof = 0;}else{ Tprof = Bid + 10* PipValue * Point;} int Tiket= OrderSend(Symbol(), OP_BUY, FixedLots, Ask, Slippage* PipValue, Sloss, Tprof, NameEA + CurTime(),MAGIC_NUM, 0, Green); prtAlert("Buying");OrderTime=Time[0]; } else { if(StopLoss == 0){Sloss = 0;}else{ Sloss = Bid + 10 * PipValue* Point;} if(TakeProfit == 0){Tprof = 0;}else{ Tprof = Ask - 10 * PipValue* Point;} Tiket= OrderSend(Symbol(), OP_SELL, FixedLots, Bid, Slippage* PipValue, Sloss, Tprof, NameEA + CurTime(),MAGIC_NUM, 0, Red); prtAlert("Selling");OrderTime=Time[0]; } } else { if (OrderType() == OP_BUY) { double slSize = MathAbs(OrderStopLoss() - OrderOpenPrice()) + 10 * Point* PipValue; double tpSize = slSize; Sloss = Bid + slSize; Tprof = Ask - tpSize; Tiket= OrderSend(Symbol(), OP_SELL, FixedLots, Ask, Slippage* PipValue, Sloss, Tprof, NameEA + CurTime(),MAGIC_NUM, 0, Green); prtAlert("Buying"); } else { slSize = MathAbs(OrderStopLoss() - OrderOpenPrice()) + 10 * Point* PipValue; tpSize = slSize; Sloss = Ask - slSize; Tprof = Bid + tpSize; Tiket= OrderSend(Symbol(), OP_BUY, FixedLots, Ask, Slippage* PipValue, Sloss, Tprof, NameEA + CurTime(),MAGIC_NUM, 0, Green); prtAlert("Buying"); } } } //===================================================================================================// Для легкости понимание удаляем из кода StartWithBuy. Теперь начнем с началу: - Сразу после запуск советника откроем одна ордер на покупку(Buy) с 10п ТП и СЛ; - Если сработал ТП тогда откроем ордер на покупка(Buy) тоже с 10п ТП и СЛ(то есть каждый раз после срабатывание ТП повторяется первый шаг); - Если сработал СЛ тогда откроем противоположный ордер то есть продажу(Sell) с 20п(удвоенным) ТП и СЛ; - Если опять сработал СЛ, теперь тоже откроем противоположный ордер(Buy) с удвоенным ТП и СЛ; - Если теперь сработал ТП тогда повторяется первый шаг(не зависимо на типу последного ордера откроем ордер на покупку с начальном ТП и СЛ); Пожалуйста, еще раз помогите с кодам?!

Scriptong: Husanboy пишет: Извиняюсь?! Опять не получилось(не откроется ни какого ордера)! Конечно, не откроется. Откроется только в том случае, если не получилось выбрать ордер. Именно такое условие Вы поставили в начало блока: if (!OrderSelect(lastTicket, SELECT_BY_TICKET)) Читается так: если НЕ удалось выбрать ордер с тикетом lastTicket, то выполнить следующее. Там, где я в примерах использовал такую конструкцию, после условия следовал оператор: return (0); то есть выход из обработки тика. Таким образом, Вам нужно обрабатывать ситуацию, когда выбран ордер.

Husanboy: Scriptong пишет: Конечно, не откроется. Откроется только в том случае, если не получилось выбрать ордер. Именно такое условие Вы поставили в начало блока: цитата: if (!OrderSelect(lastTicket, SELECT_BY_TICKET)) Читается так: если НЕ удалось выбрать ордер с тикетом lastTicket, то выполнить следующее. Там, где я в примерах использовал такую конструкцию, после условия следовал оператор: цитата: return (0); то есть выход из обработки тика. Таким образом, Вам нужно обрабатывать ситуацию, когда выбран ордер. Да сначала поставил это как вы написали(if (!OrderSelect(lastTicket, SELECT_BY_TICKET)) return 0; ), но все равно не открылся ордер и потом удалял эту из кода и опять не работал. Вот сделал так, но все равно не работает: int lastTicket = FindLastHistoryOrderParameter(MAGIC_NUM, "ticket"); if (!OrderSelect(lastTicket, SELECT_BY_TICKET)) return (0); if(OrderProfit() > 0) { if(StartWithBuy) { if(StopLoss == 0){Sloss = 0;} else{ Sloss = Ask - 10* PipValue * Point;} if(TakeProfit == 0){Tprof = 0;}else{ Tprof = Bid + 10* PipValue * Point;} int Tiket= OrderSend(Symbol(), OP_BUY, FixedLots, Ask, Slippage* PipValue, Sloss, Tprof, NameEA + CurTime(),MAGIC_NUM, 0, Green); prtAlert("Buying");OrderTime=Time[0]; } else { if(StopLoss == 0){Sloss = 0;}else{ Sloss = Bid + 10 * PipValue* Point;} if(TakeProfit == 0){Tprof = 0;}else{ Tprof = Ask - 10 * PipValue* Point;} Tiket= OrderSend(Symbol(), OP_SELL, FixedLots, Bid, Slippage* PipValue, Sloss, Tprof, NameEA + CurTime(),MAGIC_NUM, 0, Red); prtAlert("Selling");OrderTime=Time[0]; } } else if ( OrderType() == OP_BUY) { double slSize = MathAbs(OrderStopLoss() - OrderOpenPrice()) + 10 * Point* PipValue; double tpSize = slSize; Sloss = Bid + slSize; Tprof = Ask - tpSize; Tiket= OrderSend(Symbol(), OP_SELL, FixedLots, Ask, Slippage* PipValue, Sloss, Tprof, NameEA + CurTime(),MAGIC_NUM, 0, Green); prtAlert("Buying"); } else { slSize = MathAbs(OrderStopLoss() - OrderOpenPrice()) + 10 * Point* PipValue; tpSize = slSize; Sloss = Ask - slSize; Tprof = Bid + tpSize; Tiket= OrderSend(Symbol(), OP_BUY, FixedLots, Ask, Slippage* PipValue, Sloss, Tprof, NameEA + CurTime(),MAGIC_NUM, 0, Green); prtAlert("Buying"); }

Scriptong: Husanboy пишет: Вот сделал так, но все равно не работает: Приведите весь код, пожалуйста - закачайте mq4 файл на dropmefiles.com или любой другой файловый сервер.

Husanboy: Scriptong пишет: dropmefiles.com Пожалуйста: http://dropmefiles.com/DPETz

Scriptong: Husanboy пишет: Пожалуйста: http://dropmefiles.com/DPETz Что-то перепутали. По ссылке расположен эксперт ЕА, но кода в нем, по сути то и нет. Только то, что автоматически сгенерировал мастер Meta Editor.

Husanboy: Scriptong пишет: Что-то перепутали. По ссылке расположен эксперт ЕА, но кода в нем, по сути то и нет. Только то, что автоматически сгенерировал мастер Meta Editor.

Husanboy: Все получилось! Сам поправил и это работает. Но теперь появилось другого просьба к вам - как прописать в советнике, чтобы закрытие сделок при работе на реальных счетах отображалось так же, как при визуальном тестировании (стрелками и пунктиром, соединяющим точки открытия и закрытия ордеров)?



полная версия страницы