Hi-Fi 0 Share Posted June 17, 2015 Что именно цикл должен делать? Сейчас при любом количестве ордеров в истории больше 0 будет всегда выполняться NewOrder = True; ...тренд вверх - ордер автоматом открыт, когда надо я его закрываю и прога ждет разворота, развернулось - открылось, я закрыл и так далее.... Что бы не было после закрытия, повторного открытия в ту же сторону. Quote Link to post Share on other sites
Fargoth 1 Share Posted June 18, 2015 (edited) ...тренд вверх - ордер автоматом открыт, когда надо я его закрываю и прога ждет разворота, развернулось - открылось, я закрыл и так далее.... Что бы не было после закрытия, повторного открытия в ту же сторону. Как вариант: Можно запоминать тикеты ордеров BUY и SELL при открытии. Соответственно, входить в рынок если тикет нужного направления пуст. Ну и проверку на актуальность тикета надо: static int ticketUp = 0; ... if (ticketUp != 0) { if (OrderSelect(ticketUp, SELECT_BY_TICKET)) { if (OrderCloseTime() != 0) ticketUp = 0; } else { PrintFormat("OrderSelect() was failed, Code of error = d%", GetLastError()); ticketUp = 0; } } if (ticketUp == 0) ticketUp = OrderSend(... Edited June 18, 2015 by Fargoth Quote Link to post Share on other sites
Hi-Fi 0 Share Posted June 18, 2015 Сам попросил Перебирает цикл, а эта выбирает. Думаю, ты это и имел ввиду. ctm>0 действительно всегда истинно. NewOrder перед циклом инициализирована в false, то есть в 0. OP_BUY это то же 0. Значит NewOrder == OP_BUY то же истинно. В итоге if(ctm>0 && NewOrder == OP_BUY) = true. По крайней мере пока NewOrder не сменил состояние. Дальше выполняется проверка ещё одного условия. Если выбранный ордер Sell типа. Но условия заканцивается точкой с запятой, значит при соблюдении этого условия ничего делать не надо. Да, эта операция будет выполняться всегда. Это условие выполняется всегда. ctm>0=true, NewOrder теперь true, значит =1. OP_SELL=1. if(ctm>0 && NewOrder == OP_SELL)=true. Здесь проверяется что выбранный ордер Buy типа. Но никаких операций нет. Операция присвоения истины переменной NewOrder уже выполнялось выше, с тех пор ничего не изменилось. Верно. По сити получается проверка наличия исторических ордеров любого типа. Если есть хотя бы один закрытый ордер NewOrder = True ааааааааааа ни так ни так не помогает. так хорошо расписали, что не правильно, поясните, так как всетаки надо. :help: Quote Link to post Share on other sites
Ugar68 372 Share Posted June 18, 2015 (edited) поясните, так как всетаки надо. Я же написал кусок кода и описал результат работы. Остаётся вставить его в нужное место и правильно использовать переменную с результатом. Edited June 18, 2015 by Ugar68 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
Hi-Fi 0 Share Posted June 18, 2015 Я же написал кусок кода и описал результат работы. Остаётся вставить его в нужное место и правильно использовать переменную с результатом. Вот что у меня есть... //Buy if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) { if (!IsTrade) { //Check free margin if (AccountFreeMargin() < (1000 * Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if (StopLossMode) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0; if (TakeProfitMode) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0; Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue); if(Ticket > 2) { if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) { Print("BUY order opened : ", OrderOpenPrice()); if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy"); } else { Print("Error opening BUY order : ", GetLastError()); } } if (EachTickMode) TickCheck = True; if (!EachTickMode) BarCount = Bars; if (Sound_Open!="") PlaySound(Sound_Open); Alert("Ордер Buy открыт!"); return(0); Но в какое бы место я его не ставил, в начало или перед Ticket = OrderSend, то или компиляция не идет или же все равно идут не в разнобой сделки. Quote Link to post Share on other sites
Ugar68 372 Share Posted June 19, 2015 Вот что у меня есть... //Buy if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) { if (!IsTrade) { //Check free margin if (AccountFreeMargin() < (1000 * Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if (StopLossMode) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0; if (TakeProfitMode) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0; Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue); if(Ticket > 2) { if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) { Print("BUY order opened : ", OrderOpenPrice()); if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy"); } else { Print("Error opening BUY order : ", GetLastError()); } } if (EachTickMode) TickCheck = True; if (!EachTickMode) BarCount = Bars; if (Sound_Open!="") PlaySound(Sound_Open); Alert("Ордер Buy открыт!"); return(0); Но в какое бы место я его не ставил, в начало или перед Ticket = OrderSend, то или компиляция не идет или же все равно идут не в разнобой сделки. Наверное, это не всё что есть. Сложно понять по чужому коду. Но видно что при открытии используется маджик, значит и при переборе ордеров желательно фильтровать их по маджику и по символу. Непонятно что за переменная SIGNAL_BUY. Скорее всего можно мой кусок кода расположить перед этими открытиями и манипулировать этими сигнальными переменными. Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
Ugar68 372 Share Posted June 19, 2015 Наверное, это не всё что есть. Сложно понять по чужому кусочку кода. Но видно что при открытии используется маджик, значит и при переборе ордеров желательно фильтровать их по маджику и символу. Непонятно что за переменная SIGNAL_BUY. Скорее всего можно мой кусок кода расположить перед этими открытиями и манипулировать этими сигнальными переменными. Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
Hi-Fi 0 Share Posted June 19, 2015 "SIGNAL_BUY" равен условиям на покупку... Спасибо, пробую..., но пока не очень...((( Quote Link to post Share on other sites
MW 0 Share Posted June 19, 2015 Здраввствуйте. Вот вопрос по индикаторам. Возможно ли при отрисовке на истории, получить значение кастомного индикатора в момент появления нового бара и использовать его при расчётах в нём самом? Как это можно представить? Спасибо. Quote Жми быка! Дави медведя! Link to post Share on other sites
AntFX 6,474 Share Posted June 19, 2015 Здраввствуйте. Вот вопрос по индикаторам. Возможно ли при отрисовке на истории, получить значение кастомного индикатора в момент появления нового бара и использовать его при расчётах в нём самом? Как это можно представить? Спасибо. Конечно можно. Это называется рекурсивным вызовом. Делается через функцию iCustom(...). Нужно только следить, чтобы эти вызовы самого себя не привели к зацикливанию. Quote 1 Link to post Share on other sites
kazakov.v 189 Share Posted June 19, 2015 получить значение кастомного индикатора в момент появления нового бара Использовать цену Open[] Quote Никому верить нельзя. Мне - можно. Link to post Share on other sites
Hi-Fi 0 Share Posted June 26, 2015 Как то так. int total, i, LastHistOrderType=-1; datetime OrdTime, LastOrdTime; total=OrdersHistoryTotal(); for(i=total-1; i>=0; i--) { ResetLastError(); if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { Print("Исторический ордер не выбран, ошибка = ",GetLastError()); continue; } OrdTime=OrderCloseTime(); if(LastOrdTime<OrdTime) { LastOrdTime=OrdTime; LastHistOrderType=OrderType(); } } Этот код ищет последний закрытый ордер в истории, его тип будет в переменной LastHistOrderType 0-Buy, 1-Sell, -1 если последний закрытый ордер не найден. Этот код надо вставить перед открытием ордера, что бы определить какой был закрыт. СПАСИБО!!! Разобрался, заработало. Quote Link to post Share on other sites
OmegaS 21 Share Posted August 21, 2015 Подскажите , как возможно определить четность числа . Есть ли такая функция в MQL4. Quote Link to post Share on other sites
kazakov.v 189 Share Posted August 21, 2015 Подскажите , как возможно определить четность числа . Есть ли такая функция в MQL4. if( x%2 == 0 ) - значит х- четное 2 Quote Никому верить нельзя. Мне - можно. Link to post Share on other sites
абыр валГ 899 Share Posted August 21, 2015 Подскажите , как возможно определить четность числа . Есть ли такая функция в MQL4. Можно поделить его на 2 и проверить есть ли остаток от деления. 1 Quote Какую часть средств инвестировать? Link to post Share on other sites
OmegaS 21 Share Posted August 24, 2015 if( x%2 == 0 ) - значит х- четное разьясните пож. выражение Quote Link to post Share on other sites
Ugar68 372 Share Posted August 24, 2015 разьясните пож. выражение Если остаток от деления х на 2 равен 0, то х четное. Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
pr0gre55 4 Share Posted August 24, 2015 (edited) привет, MQL5 не могу разобраться с Printf(): объявляю в переменных int handle_if; Хэндл выводится, индикатор на графике показывается. Позже вывожу: printf("handle_if ",IntegerToString(handle_if)); в логе 20:20:29.030 118 (EURUSD,H1) handle_if что не так делаю? printf("IF ", IntegerToString(BarsCalculated(handle_if))); printf("IMA ", IntegerToString(BarsCalculated(handle_ima))); выводит только: 2015.08.24 20:20:42.368 118 (EURUSD,H1) IMA 2015.08.24 20:20:42.368 118 (EURUSD,H1) IF Edited August 24, 2015 by pr0gre55 Quote Link to post Share on other sites
Den2S 131 Share Posted August 28, 2015 Резервирование VPS или как организовать 2VPS на один торговый счет? Интересует как сделать так чтобы один счет управлялся с двух VPS по одной и той же торговой системе, при этом чтобы VPS2 проставлял ордера только в случае если VPS1 оказался неисправным, недоступным, отключенным или еще как неработоспособным. Как наладить их синхронную работу не нарушая принципа работы торговой системы? Quote Тот инвестор, который не фиксирует каждые 5% прибыли со своего счета, в результате потеряет всё. (Касается любого инвестирования в памм-индустрии). Den2S (©) Link to post Share on other sites
kazakov.v 189 Share Posted August 28, 2015 Основной советник выставляет "сигнальный" отложенный ордер далеко от текущей цены и каждую например, минуту модифицирует у него время экспирации: это может быть текущее время плюс 1 час, или плюс 1 сутки. Вспомогательный советник ищет "сигнальный" ордер: если он отсутствует, или время экспирации давно не модифицировалось - включается в работу. Если ордер "просрочен", можно его удалить. Как только "сигнальный" ордер появился с "правильным" временем экспирации - вспомогательный советник не торгует. 3 Quote Никому верить нельзя. Мне - можно. Link to post Share on other sites
абыр валГ 899 Share Posted August 28, 2015 (edited) Резервирование VPS или как организовать 2VPS на один торговый счет? Интересует как сделать так чтобы один счет управлялся с двух VPS по одной и той же торговой системе, при этом чтобы VPS2 проставлял ордера только в случае если VPS1 оказался неисправным, недоступным, отключенным или еще как неработоспособным. Как наладить их синхронную работу не нарушая принципа работы торговой системы? Без костылей никак, МТ4 не будет работать в кластере(софт изначально должен поддерживать это). Либо машину виртуалить на кластерах и на ней мт4 запускать, вот пример http://habrahabr.ru/post/77836/ Edited August 28, 2015 by абыр валГ Quote Какую часть средств инвестировать? Link to post Share on other sites
Den2S 131 Share Posted August 28, 2015 Основной советник выставляет "сигнальный" отложенный ордер далеко от текущей цены и каждую например, минуту модифицирует у него время экспирации: это может быть текущее время плюс 1 час, или плюс 1 сутки. Вспомогательный советник ищет "сигнальный" ордер: если он отсутствует, или время экспирации давно не модифицировалось - включается в работу. Если ордер "просрочен", можно его удалить. Как только "сигнальный" ордер появился с "правильным" временем экспирации - вспомогательный советник не торгует. Чё-то не понял я . Почему один час? Допустим выходит новость, надо ставить ордер, но один ВПС накрылся и по неизвестной причине не ставит его. Тогда ордер должен выставить второй. Если второй ВПС будет выставлять ордер через 1 час, то цена за этот час уйдет далеко и безвозвратно ... Quote Тот инвестор, который не фиксирует каждые 5% прибыли со своего счета, в результате потеряет всё. (Касается любого инвестирования в памм-индустрии). Den2S (©) Link to post Share on other sites
kazakov.v 189 Share Posted August 28, 2015 Чё-то не понял я Если основной советник работает и имеет возможность совершать торговые операции, то он каждую минуту сдвигает время экспирации "сигнального" ордера на 1 час от текущего времени. Вспомогательный советник находит "сигнальный" ордер, и смотрит разницу между временем экспирации и текущим временем. Если разница 59-60 минут, значит все нормально, основной советник работает, и вмешиваться не надо. Если меньше, значит основной советник не фунциклирует. Удаляем "сигналку", и торгуем. Ясное дело советник должен уметь корректно включаться на ходу, т.е. всю необходимую информацию получать только с торгового счета. 1 Quote Никому верить нельзя. Мне - можно. Link to post Share on other sites
pr0gre55 4 Share Posted August 31, 2015 MQL5 но вопрос не по коду, в настройках MetaTrader стоит галочка-Разрешить автоматическую торговлю Экспертом открываю ордер-получаю ошибку 10027 AutoTrading disabled by client Почему? Quote Link to post Share on other sites
OmegaS 21 Share Posted September 1, 2015 (edited) Записываю в файл глобальные переменные ,все гуд ,в файле они есть, а при чтении пытаюсь вывести значение в журнал, не выводяться, думаю что-то с кодировкой, int WRITE_GLOBAL_CHAR(string File) { int res; int file_handle=FileOpen(File,FILE_WRITE|FILE_TXT); if(file_handle!=INVALID_HANDLE) { // PrintFormat("Файл %s открыт для записи",File); //--- сначала запишем количество сигналов res=FileWrite(file_handle,"VALUE1="+VALUE1); FileWrite(file_handle,"VALUE2="+VALUE2); //--- запишем время сигналов и их значения в файл //--- закрываем файл if (res==0) {PrintFormat("Ошибка записи!!!!",GetLastError());} FileClose(file_handle); // PrintFormat("Данные записаны, файл %s закрыт",File); } else PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",File,GetLastError()); return(0); } не знаю как разрулить (( прощу помощи. int READ_CLOBAL_CHAR(string File) { int Poz_v1,Poz_v2; string strv1,strv2; int fileopen=FileOpen(File,FILE_READ|FILE_TXT,";",CP_UTF8); if(fileopen<0) { // MessageBox("Неудачная попытка открыть файл по абсолютному пути"); Print("Код ошибки ",GetLastError()); } string sString = ""; if (fileopen > 0) { while (!FileIsEnding(fileopen)) { sString = FileReadString(fileopen); Poz_v1=StringFind(sString,"VALUE1=",0); if (Poz_v1>0) { strv1=StringSubstr(sString, Poz_v1+7,1); {v1=StringToInteger(strv1); Print("НАЧАЛЬНО --VALUE1= ",v1); } // Print("НАЧАЛЬНО = ",sString); } } } FileClose(fileopen); return(0); Edited September 1, 2015 by OmegaS Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.