Бесплатное написание советников и индикаторов
Сообщений: 3 |
Здравствуйте, нужен скрипт - Функцию задержки по времени (в настройках сделать в минутах) когда закрылся ордер и функцию maxorders реализовать (количество ордеров в одной паре) что бы не отрывал больше 1 ордера в одной паре пока не закрыл предыдущий ордер в настройках можно поставить ну и дополнительно функцию magic сделать(что бы различал свои ордера). -т.е нужно сделать 3 функции в скрипте, можете сделать? заранее благодарна... | ||||
Сообщений: 1 |
здравствуйте нужен советник который открывал и закрывал ордера при смене цвета данного индикатора Прикрепленные файлы:
| ||||
Сообщений: 3 |
Здравствуйте коллеги.
Кто может создать советник по следующей стратегии: Индюки: ( почему-то не могу загрузить) ©Price Border Ma_Parabolic_st2.2 1. При установке советника на график он будет открывать новую сделку только на следующей свече. 2. Советник открывает сделки на каждой следующей свече (можно по мартину с шагом задаваемым в настройках по следующей стратегии: 1.Ордера открываются при условии что цена находится внутри канала. (таймфрейм устанавливаем в настройках советника) Ордера СЕЛЛ - открываются только в том случае, когда сары находятся выше машки, и предидущая свеча медвежья. Если свеча бычья, то ордер не открываем, цикл пропускаем… 2.Ордера БАЙ – открываются только в том случае, если сары находятся под машкой и предидущая свеча бычья, если свеча медвежья – то ордер не открываем, цикл пропускаем. 3.Как только цена достигла уровня БУ (спред +3…10…20пп) включается тралл, который следует на определённом расстоянии за ценой (размер трала устанавливаем…) 4.С открытием каждого нового ордера советник пересчитывает точку безубытка, и тянет тралл за ценой на заданном расстоянии. 5.Группа ордеров закрывается либо по тралу, либо по сигналу, когда машка и сары покажут смену тренда. В случае резких движений цены по тренду: 1. При касании цены границы канала – закрывается один самый прибыльный ордер. 2. При закрытии свечи ниже границы канала, закрывается еще один( или два) самый прибыльный ордер, и открывается ЛОК, равный 50% от обьёмов оставшихся сделок. 3. В случае если цена продолжит движение, следующий лок открывается только в случае перехая (или перелоя), и полностью своим обьёмом перекрывает все сделки, а на первый локирующий ордер ставится ТП (спред +1…3пп… или тралл начиная безубытка….) 4. Если цена пошла дальше – то новые сделки не открываются. Если цена вернулась в канал – она сначала закрывает первый лок. 5. Далее – если цена снова пошла в сторону оставшегося лока и закрылась ниже него, то снова закрывается самая прибыльная сделка, и ставится еще лок перекрывающий все позиции, а на предидущий лок – безубыток, и так сопровождаем сделки до разворота цены… 6. А если цена закрыла первый лок и пошла дальше, закроются все сделки по траллу, а на оставшийся лок ставится тралл. Советник отдельно ведёт ордера группы СЕЛЛ и БАЙ. Тоесть, Например открыто 10 сделок в селл и идёт их трал, в случае резкого движения цены и установке первого лока БАЙ – трейлингстоп по селлам не пересчитывает ся Неплохо было бы если бы советник подхватывал ручные ордера, сам их классифицировал (селл или бай) и пересчитывал точку безубытка и трал по всей открытой группе.. Как то так... Редактировалось: 2 раз (Последний: 2 июля 2017 в 17:49) | ||||
Сообщений: 3 |
похоже никто не возьмётся написать советника... :scratch: прийдётся работать без грааля... :laugh: | ||||
Сообщений: 1 |
Всем добрый день. Ищу программиста на бесплатной основе для создания ВЫСОКОТОЧНОГО РЕВЕРСА, без перерисовки.
ФОРМУЛА и ТЕХНОЛОГИЯ ОПТИМИЗАЦИИ ФОРМУЛЫ у меня есть в виде чётко проработанного Тех. Задания. Кому интересно - черканите свой Скайп мне в Личку. Скрин с примером результата реализации ниже: Редактировалось: 1 раз (Последний: 18 июля 2017 в 10:29) | ||||
Сообщений: 3 |
Добрый вечер
Можете помочь добавить функцию усреднения в советник . | ||||
Сообщений: 3 |
// Объём сделки
input double _Lots = 0.1; // Stop Loss (в пунктах) input int _SL = 1000; // Take Profit (в пунктах) input int _TP = 5; // Magic Number (метка "своих" сделок для робота) input int _MagicNumber = 0; // Комментарий для сделок input string _Comment = "SLIP"; // Допустимое проскальзывание input int _Slippage = 5; // Одновременно не более одной сделки input bool _OnlyOneOpenedPos = true; // Автоучёт числа знаков цены input bool _AutoDigits = true; // --- // Moving_Average1MED input int period = 200; input int shift = 0; input int method = 2; input int apply = 4; // --- // Moving_AverageBIS input int period_2 = 50; input int shift_2 = 0; input int method_2 = 2; input int apply_2 = 4; // --- // Stochastic_Oscillator1 input int kperiod = 21; input int dperiod = 8; input int slowing = 3; input int method_3 = 0; input int apply_3 = 0; // --- // Stochastic_Oscillator0 input int kperiod_2 = 21; input int dperiod_2 = 8; input int slowing_2 = 3; input int method_4 = 0; input int apply_4 = 0; // --- double OP_LOTS = 0.0; // --- // MQL4 | класс автоопределния числа знаков после запятой у текущего инструмента | class CKDig { public: CKDig(const bool useAutoDigits) { Set(useAutoDigits); } ~CKDig(void) { } uint Get(void) { return m_value; } private: uint m_value; void Set(const bool useAutoDigits) { m_value = 1; if (!useAutoDigits) { return; } if (Digits() == 3 || Digits() == 5) { m_value = 10; } } }; CKDig *KDig; #define K_DIG (KDig.Get()) datetime LAST_BUY_BARTIME = 0; datetime LAST_SELL_BARTIME = 0; // --- void OnInit() { // --- get_lots_by_input(); // --- KDig = new CKDig(_AutoDigits); } // --- void OnDeinit(const int reason) { // --- // --- if(CheckPointer(KDig)) { delete KDig; } } // --- void OnTick() { // --- // закрытие сделки if(find_orders(_MagicNumber)) { if(cl_buy_sig()) { cbm(_MagicNumber, _Slippage, OP_BUY); } if(cl_sell_sig()) { cbm(_MagicNumber, _Slippage, OP_SELL); } } // открытие сделки // --- // --- if(!find_orders(_MagicNumber, (_OnlyOneOpenedPos ? -1 : OP_BUY))) { if(op_buy_sig() && LAST_BUY_BARTIME != iTime(Symbol(), Period(), 0)) { LAST_BUY_BARTIME = iTime(Symbol(), Period(), 0); open_positions(OP_BUY, OP_LOTS); } } // --- if(!find_orders(_MagicNumber, (_OnlyOneOpenedPos ? -1 : OP_SELL))) { if(op_sell_sig() && LAST_SELL_BARTIME != iTime(Symbol(), Period(), 0)) { LAST_SELL_BARTIME = iTime(Symbol(), Period(), 0); open_positions(OP_SELL, OP_LOTS); } } } // --- // --- // --- void get_lots_by_input() { //MQL4 | присвоение объёма по входному параметру | OP_LOTS = _Lots; } // --- // --- bool find_orders(int magic = -1, int type = -1, int time = -1, string symb = "NULL", double price = -1, double lot = -1) { // MQL4 | функция поиска открытых ордеров | // возвращает истину, если найден хотя бы один ордер с подходящими параметрами for (int i = OrdersTotal() - 1; i >= 0; i--) { if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) break; if (((OrderType() == type) || (type == -1)) && ((OrderMagicNumber() == magic) || (magic == -1)) && ((OrderSymbol() == symb) || (symb == "NULL" && OrderSymbol() == Symbol())) && ((OrderOpenTime() >= time) || (time == -1)) && ((OrderLots() == lot) || (lot == -1)) && ((NormalizeDouble(OrderOpenPrice(), Digits) == NormalizeDouble(price, Digits)) || (price == -1))) { return (true); break; } } return (false); } // --- string Market_Err_To_Str(int errCode) { // MQL4 | функция расшифровки кодов ошибок | // функция охватывает только коды ошибок торговых операций string errText; switch (errCode) { case 0: errText = "Нет ошибок"; break; case 1: errText = "Нет ошибки, но результат неизвестен"; break; case 2: errText = "Общая ошибка"; break; case 3: errText = "Неправильные параметры"; break; case 4: errText = "Торговый сервер занят"; break; case 5: errText = "Старая версия клиентского терминала"; break; case 6: errText = "Нет связи с торговым сервером"; break; case 7: errText = "Недостаточно прав"; break; case 8: errText = "Слишком частые запросы"; break; case 9: errText = "Недопустимая операция нарушающая функционирование сервера"; break; case 64: errText = "Счет заблокирован"; break; case 65: errText = "Неправильный номер счета"; break; case 128: errText = "Истек срок ожидания совершения сделки"; break; case 129: errText = "Неправильная цена"; break; case 130: errText = "Неправильные стопы"; break; case 131: errText = "Неправильный объем"; break; case 132: errText = "Рынок закрыт"; break; case 133: errText = "Торговля запрещена"; break; case 134: errText = "Недостаточно денег для совершения операции"; break; case 135: errText = "Цена изменилась"; break; case 136: errText = "Нет цен"; break; case 137: errText = "Брокер занят"; break; case 138: errText = "Новые цены"; break; case 139: errText = "Ордер заблокирован и уже обрабатывается"; break; case 140: errText = "Разрешена только покупка"; break; case 141: errText = "Слишком много запросов"; break; case 145: errText = "Модификация запрещена, так как ордер слишком близок к рынку"; break; case 146: errText = "Подсистема торговли занята"; break; case 147: errText = "Использование даты истечения ордера запрещено брокером"; break; case 148: errText = "Количество открытых и отложенных ордеров достигло предела, установленного брокером."; break; case 4000: errText = "Нет ошибки"; break; case 4001: errText = "Неправильный указатель функции"; break; case 4002: errText = "Индекс массива - вне диапазона"; break; case 4003: errText = "Нет памяти для стека функций"; break; case 4004: errText = "Переполнение стека после рекурсивного вызова"; break; case 4005: errText = "На стеке нет памяти для передачи параметров"; break; case 4006: errText = "Нет памяти для строкового параметра"; break; case 4007: errText = "Нет памяти для временной строки"; break; case 4008: errText = "Неинициализированная строка"; break; case 4009: errText = "Неинициализированная строка в массиве"; break; case 4010: errText = "Нет памяти для строкового массива"; break; case 4011: errText = "Слишком длинная строка"; break; case 4012: errText = "Остаток от деления на ноль"; break; case 4013: errText = "Деление на ноль"; break; case 4014: errText = "Неизвестная команда"; break; case 4015: errText = "Неправильный переход"; break; case 4016: errText = "Неинициализированный массив"; break; case 4017: errText = "Вызовы DLL не разрешены"; break; case 4018: errText = "Невозможно загрузить библиотеку"; break; case 4019: errText = "Невозможно вызвать функцию"; break; case 4020: errText = "Вызовы внешних библиотечных функций не разрешены"; break; case 4021: errText = "Недостаточно памяти для строки, возвращаемой из функции"; break; case 4022: errText = "Система занята"; break; case 4050: errText = "Неправильное количество параметров функции"; break; case 4051: errText = "Недопустимое значение параметра функции"; break; case 4052: errText = "Внутренняя ошибка строковой функции"; break; case 4053: errText = "Ошибка массива"; break; case 4054: errText = "Неправильное использование массива-таймсерии"; break; case 4055: errText = "Ошибка пользовательского индикатора"; break; case 4056: errText = "Массивы несовместимы"; break; case 4057: errText = "Ошибка обработки глобальныех переменных"; break; case 4058: errText = "Глобальная переменная не обнаружена"; break; case 4059: errText = "Функция не разрешена в тестовом режиме"; break; case 4060: errText = "Функция не разрешена"; break; case 4061: errText = "Ошибка отправки почты"; break; case 4062: errText = "Ожидается параметр типа string"; break; case 4063: errText = "Ожидается параметр типа integer"; break; case 4064: errText = "Ожидается параметр типа double"; break; case 4065: errText = "В качестве параметра ожидается массив"; break; case 4066: errText = "Запрошенные исторические данные в состоянии обновления"; break; case 4067: errText = "Ошибка при выполнении торговой операции"; break; case 4099: errText = "Конец файла"; break; case 4100: errText = "Ошибка при работе с файлом"; break; case 4101: errText = "Неправильное имя файла"; break; case 4102: errText = "Слишком много открытых файлов"; break; case 4103: errText = "Невозможно открыть файл"; break; case 4104: errText = "Несовместимый режим доступа к файлу"; break; case 4105: errText = "Ни один ордер не выбран"; break; case 4106: errText = "Неизвестный символ"; break; case 4107: errText = "Неправильный параметр цены для торговой функции"; break; case 4108: errText = "Неверный номер тикета"; break; case 4109: errText = "Торговля не разрешена. Необходимо включить опцию Разрешить советнику торговать в свойствах эксперта."; break; case 4110: errText = "Длинные позиции не разрешены. Необходимо проверить свойства эксперта."; break; case 4111: errText = "Короткие позиции не разрешены. Необходимо проверить свойства эксперта."; break; case 4200: errText = "Объект уже существует"; break; case 4201: errText = "Запрошено неизвестное свойство объекта"; break; case 4202: errText = "Объект не существует"; break; case 4203: errText = "Неизвестный тип объекта"; break; case 4204: errText = "Нет имени объекта"; break; case 4205: errText = "Ошибка координат объекта"; break; case 4206: errText = "Не найдено указанное подокно"; break; default: errText = "Ошибка при работе с объектом"; } // --- return (errText); } // --- void open_positions(int signal, double lot, double price = 0.0, string symb = "NONE", int mode = 0) { // MQL4 | функция открытия ордеров | RefreshRates(); // --- int symbDigits = 0; string _symb = symb; // --- if (_symb == "NONE") { symbDigits = Digits; _symb = Symbol(); } else symbDigits = int(MarketInfo(_symb, MODE_DIGITS)); // --- if (signal == OP_BUY) price = NormalizeDouble(MarketInfo(_symb, MODE_ASK), symbDigits); // цена открытия для покупок if (signal == OP_SELL) price = NormalizeDouble(MarketInfo(_symb, MODE_BID), symbDigits); // цена открытия для продаж // --- int err = 0; for (int i = 0; i <= 5; i++) { RefreshRates(); // --- int ticket = OrderSend(_symb, // символ signal, // тип ордера lot, // объем NormalizeDouble(price, symbDigits), // цена открытия _Slippage * KDig.Get(), // уровень допустимого реквота 0, // Stop Loss 0, // Take Profit _Comment, // комментарий ордера _MagicNumber, // магическое число 0, // срок истечения (используется в отложенных ордерах) CLR_NONE); // цвет отображаемой стрелки на графике (CLR_NONE - стрелка не рисуется) // --- if (ticket != -1) { err = 0; // --- if (!IsTesting()) Sleep(1000); // --- RefreshRates(); // --- if(_SL != 0 || _TP != 0) { for (int tryModify = 0; tryModify <= 5; tryModify++) { RefreshRates(); // --- if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) { double sl = NormalizeDouble(get_sl(_SL * KDig.Get(), signal, price, _symb), symbDigits); double tp = NormalizeDouble(get_tp(_TP * KDig.Get(), signal, price, _symb), symbDigits); // --- if (sl != 0 || tp != 0) if (OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, OrderExpiration())) break; // --- err = GetLastError(); // получаем код ошибки модификации } // --- if (!IsTesting()) Sleep(tryModify*1000); } // --- if (err != 0) Alert("Ошибка выставления SL/TP: " + Market_Err_To_Str(err)); } // --- break; } else { err = GetLastError(); // получаем код ошибки открытия // --- if (err == 0) break; // --- i++; // --- if (!IsTesting()) Sleep(i*500); // в случае ошибки делаем паузу перед новой попыткой } } // --- if (err != 0) { if(signal == OP_BUY) LAST_BUY_BARTIME = 0; if(signal == OP_SELL) LAST_SELL_BARTIME = 0; Alert("Ошибка открытия: " + Market_Err_To_Str(err)); // если есть ошибка - выводим сообщение } } // --- double get_tp(int tp_value, int type, double price = 0.0, string symb = "NONE") { // MQL4 | функция расчета величины Take Profit для ордеров | double _price = price; string _symb = symb; // --- if (_symb == "NONE") _symb = Symbol(); int symbDigits = int(MarketInfo(_symb, MODE_DIGITS)); // --- if (_price == 0) { if (type == OP_BUY) _price = NormalizeDouble(MarketInfo(_symb, MODE_ASK), symbDigits); // --- if (type == OP_SELL) _price = NormalizeDouble(MarketInfo(_symb, MODE_BID), symbDigits); } // --- if (tp_value > 0) { if (type == OP_BUY || type == OP_BUYLIMIT || type == OP_BUYSTOP) return NormalizeDouble(_price + tp_value * MarketInfo(_symb, MODE_POINT), symbDigits); // --- if (type == OP_SELL || type == OP_SELLLIMIT || type == OP_SELLSTOP) return NormalizeDouble(_price - tp_value * MarketInfo(_symb, MODE_POINT), symbDigits); } // --- return 0.0; } // --- double get_sl(int sl_value, int type, double price = 0.0, string _symb = "NONE") { // MQL4 | функция расчета величины Stop Loss для ордеров по фиксированному значению SL | if (_symb == "NONE") _symb = Symbol(); int symbDigits = int(MarketInfo(_symb, MODE_DIGITS)); double symbPoint = MarketInfo(_symb, MODE_POINT); // --- if (price == 0.0) { if (type == OP_BUY) price = NormalizeDouble(MarketInfo(_symb, MODE_ASK), symbDigits); if (type == OP_SELL) price = NormalizeDouble(MarketInfo(_symb, MODE_BID), symbDigits); } // --- if (sl_value > 0) { if (type == OP_BUY || type == OP_BUYLIMIT || type == OP_BUYSTOP) return NormalizeDouble(price - sl_value * symbPoint, symbDigits); if (type == OP_SELL || type == OP_SELLLIMIT || type == OP_SELLSTOP) return NormalizeDouble(price + sl_value * symbPoint, symbDigits); } // --- return 0.0; } // --- bool close_by_ticket(const int ticket, const int slippage) { /* MQL4 | функция закрытия сделки по её номеру (тикету) | При закрытии рыночного ордера учитывается уровень максимально допустимого проскальзывания (slipage) */ if (!OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) // выбираем ордер по тикету { return false; } int err = 0; for (int i = 0; i < 5; i++) { ResetLastError(); RefreshRates(); double price = 0.0; if (OrderType() == OP_BUY) { price = NormalizeDouble(SymbolInfoDouble(OrderSymbol(), SYMBOL_BID), (int)SymbolInfoInteger(OrderSymbol(), SYMBOL_DIGITS)); } if (OrderType() == OP_SELL) { price = NormalizeDouble(SymbolInfoDouble(OrderSymbol(), SYMBOL_ASK), (int)SymbolInfoInteger(OrderSymbol(), SYMBOL_DIGITS)); } // если рыночный ордер - закрываем его, если отложенный - удаляем bool result = false; if (OrderType() <= OP_SELL) { result = OrderClose(OrderTicket(), OrderLots(), price, slippage * KDig.Get(), clrNONE); } else { result = OrderDelete(OrderTicket()); } if (result) // если закрытие или удаление прошло успешно - возвращаем true и выходим из цикла { return (true); } err = GetLastError(); if (err != 0) { Print("Error of close_by_ticket() #" + (string)err + ": " + Market_Err_To_Str(err)); // если есть ошибка - даём расшифровку её кода в журнал } Sleep(300 * i); } return (false); } // --- bool cbm(int magic, int slippage, int type) { /* close by magic (закрытие всех ордеров данного типа с данным MagicNumber) Учитывается максимально допустимое проскальзывание (slipage) Используется функция close_by_ticket. */ int n = 0; RefreshRates(); for (int i = OrdersTotal() - 1; i >= 0; i--) { if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) break; if ((OrderType() == type) && (OrderMagicNumber() == magic) && (Symbol() == OrderSymbol())) { close_by_ticket(OrderTicket(), slippage); // закрываем сделку n++; // наращиваем счётчик закрытых сделок (на самом деле - попыток закрытия) } } if (n > 0) // если попыток закрытия было больше 0, то функция возвращает true return (true); return (false); } double e_Moving_Average1MED() { return iMA(NULL, 0, period, shift, method, apply, 1); } double e_Moving_AverageBIS() { return iMA(NULL, 0, period_2, shift_2, method_2, apply_2, 1); } double e_Stochastic_Oscillator1() { return iStochastic(NULL, 0, kperiod, dperiod, slowing, method_3, apply_3, 0, 1); } double e_Stochastic_Oscillator0() { return iStochastic(NULL, 0, kperiod_2, dperiod_2, slowing_2, method_4, apply_4, 0, 0); } // --- bool op_buy_sig() { if((e_Moving_AverageBIS() > e_Moving_Average1MED()) && ((e_Stochastic_Oscillator1() < 7) && (e_Stochastic_Oscillator0() > 7))) return true; // --- return false; } // --- bool op_sell_sig() { if((e_Moving_AverageBIS() < e_Moving_Average1MED()) && ((e_Stochastic_Oscillator1() > 93) && (e_Stochastic_Oscillator0() < 93))) return true; // --- return false; } // --- bool cl_buy_sig() {if((e_Moving_AverageBIS() < e_Moving_Average1MED()) && ((e_Stochastic_Oscillator1() > 93) && (e_Stochastic_Oscillator0() < 93))) return true; return false; } // --- bool cl_sell_sig() {if((e_Moving_AverageBIS() > e_Moving_Average1MED()) && ((e_Stochastic_Oscillator1() < 7) && (e_Stochastic_Oscillator0() > 7))) return true; return false; } | ||||
Сообщений: 3 |
Добры днь
Ели кто может помогите написать советник Как должен работать. 1)открытие сделки - МА50 > МА200 открываем только в BUY, МА50 < МА200 открываем только SELL Стохастик (М5) BUY - основная линия индикатора ( бар) закрылся выше 93. Следующий текущий бар стал ниже 93.+ МА SELL- основная линия индикатора ( бар) закрылся ниже 7. Следующий текущий бар стал выше 7 +МА 2) Если цена пошла не в нашу сторону то ставится отложенный ордер на определенном расстояние от ставки (с увеличенным лотом) по направлению нашей первой сделки и т.д пока серия сделок не закроется по ТР. 3)также необходимые настройки для оптимизации советника: - лот -настройки индикатора стохастик -Настройки МА -ТР по усреднению (То есть если первая сделка открыта с ТР 30 пунктов то на 2 колене ТР от этих сделок должен составлять 60 пунктов и т.д) -Возможность выставление времени работы советника -Коэффициент умножения для усреднения -Проскальзование - Коментарии - И по возможности ограничение по спреду - И также если возможно чтобы на истории показывалось где была открыта и закрыта сделка (как в тестере стратегии) | ||||
Сообщений: 1 |
Необходим советник-скальпер на отложенных ордерах
Здравствуйте. Прошу ВАС бесплатно сделать следующий советник, очень нужно! Техническое задание: 1. Определяем тренд по ЕМА 14 (Close) 2. В зависимости от тренда выбираем приоритет сделок 3. Временной интервал М5 или М15, платформа МТ4 4. Как только свеча отбивается от мувинга, в конце хвоста предыдущей завершенной свечи на расстоянии 2 пунктов ставим отложенный ордер на покупку или на продажу. 5. Как только цена цепляет ордер, стоплосс ставим на другом конце формирующейся свечи на расстоянии 2 пункта и тралим по безубытку. Подробнее об этой стратегии описано в методике от трейдера Марата Газизова, ссылка: www.youtube.com/watch?v=Dhms9szwvEI&t=1506s (смотреть от 16:04 минуты). | ||||
Сообщений: 1 |
Здравствуйте участники форума. Прошу помощи. Я новичек, никак не могу реализовать функцию в советнике. Помогите пожалуйста кодом. Что нужно прописать? Логика такая в советнике. Открывается по сигналу сделка в определенное время( время выставляется вручную) Если сделак пошла не в нужную сторону, то срабатывает вторая сделка удвоенным лотом и так пока не выйдет в плюс( это как неваляшка) Нужен код закрытия ордеров при выходе в плюс и больше не торговать в этот день. А то у меня вышел в плюс допустим в 6 часов вечера по тейку и снова открыл сделку. А нужно , чтобы не открывал, а откроется на след. день в моё время. Спасибо заранее. | ||||
Сообщений: 2 |
Здравствуйте, уважаемые программисты.
Прошу написать советник на фракталах. Прилагаются подробные картинки по стратегии. Расположение фракталов строго как на картинке. TP рассчитывается по схеме на картинке. SL выставляется под фракталом для BUY и над фракталом для SELL. Проскальзывание и спред учесть в коде советника. Во входных переменных советника: Lot | ||||
Сообщений: 2 |
Здравствуйте, уважаемые программисты.
Можно добавить АЛЕРТ в советник. Алерт должен выдавать информацию после закрытия ордера: "ПРОФИТ = 20$, GBPUSD", т.е. профит и символ торгуемой пары. Советник прилагается. //+------------------------------------------------------------------+ //| High_Low.mq4 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ input double lot= 0.22; extern int TP = 1000; // ПРОФИТ input int _period_ma = 55; // Период МА extern bool _trailingStop = true; // вкл. трала input int magic = 123; // -----------------------------------------------Number of bars to scan //+------------------------------------------------------------------+ //| Подсчет ордеров по типу | //+------------------------------------------------------------------+ int CountOrders(int type=-1) { int count=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic) { if(OrderType()==type || type==-1) count++; } } } return(count); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if (_trailingStop) { _TrailingStop(); } int r=0; CountOrders(); if(NormalizeDouble(iHigh(_Symbol, _Period, 1), Digits) < Ask && CountOrders(OP_BUY) < 1 && NormalizeDouble(iMA(NULL,0,_period_ma,0,MODE_SMA,PRICE_CLOSE,1), Digits)< NormalizeDouble(iClose(_Symbol, _Period, 1), Digits) && NormalizeDouble(iMA(NULL,0,_period_ma,0,MODE_SMA,PRICE_CLOSE,1), Digits)> NormalizeDouble(iLow(_Symbol, _Period, 1), Digits)) { r = OrderSend(Symbol(), OP_BUY, NormalizeDouble(lot, 2), Ask, 30, NormalizeDouble(Ask + 500*Point, Digits), //SL NormalizeDouble(iHigh(_Symbol, _Period, 1) + TP*Point, Digits), //TP "МАША", magic, 0, Blue); // BUY } else if(NormalizeDouble(iLow(_Symbol, _Period, 1), Digits) > Bid && CountOrders(OP_SELL) < 1 && NormalizeDouble(iMA(NULL,0,_period_ma,0,MODE_SMA,PRICE_CLOSE,1), Digits)> NormalizeDouble(iClose(_Symbol, _Period, 1), Digits) && NormalizeDouble(iMA(NULL,0,_period_ma,0,MODE_SMA,PRICE_CLOSE,1), Digits)< NormalizeDouble(iHigh(_Symbol, _Period, 1), Digits)) { r = OrderSend(Symbol(), OP_SELL, NormalizeDouble(lot, 2), Bid, 30, NormalizeDouble(Bid - 500*Point, Digits),, //SL NormalizeDouble(iLow(_Symbol, _Period, 1) - TP*Point, Digits), //TP "МАША", magic, 0, Red); // SELL } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ void _TrailingStop(){ int i; bool m; double _stopLossSellF=NormalizeDouble(iMA(NULL,0,_period_ma,0,MODE_SMA,PRICE_CLOSE,1), Digits), _stopLossBuyF=NormalizeDouble(iMA(NULL,0,_period_ma,0,MODE_SMA,PRICE_CLOSE,1), Digits); if (OrdersTotal()>0){ for (i=OrdersTotal()-1; i>=0; i--){ if (OrderSelect(i, SELECT_BY_POS)){ if (OrderSymbol()==Symbol() /*&& OrderMagicNumber()==-1*/){ if (OrderType()==OP_BUY && OrderOpenPrice() < _stopLossBuyF){ while (IsTradeContextBusy()) Sleep(1000); RefreshRates(); m = OrderModify(OrderTicket(),OrderOpenPrice(),_stopLossBuyF,OrderTakeProfit(),OrderExpiration(),CLR_NONE); } if (OrderType()==OP_SELL && OrderOpenPrice() > _stopLossSellF && _stopLossSellF!=0.0){ while (IsTradeContextBusy()) Sleep(1000); RefreshRates(); m = OrderModify(OrderTicket(),OrderOpenPrice(),_stopLossSellF,OrderTakeProfit(),OrderExpiration(),CLR_NONE); } } } } } return; } //+------------------------------------------------------------------+ Файл не загружается, пришлось так. Редактировалось: 1 раз (Последний: 24 марта 2021 в 19:23) | ||||
Сообщений: 1 |
Уважаемые программисты, есть индикатор тренда мт4 ForexGumpUltra v2.0, но проблема в том, что это демо и выскакивает окно закрывающее график
можно ли убрать? Есть рабочий трендовый индикатор PipFinite Trend PRO и в 3 раза дороже, но при установке на график два индикатора повышается возможность более точного входа в сделку. С уважением. Прикрепленные файлы:
| ||||
Сообщений: 1 |
Добрый день. Тут еще обсуждаются вопросы написания советников? Есть хорошая идея, советник простой и не использует индикаторов. Редактировалось: 1 раз (Последний: Сегодня в 13:04) |
В начало страницы |
Быстрый ответ
Чтобы писать на форуме, зарегистрируйтесь или авторизуйтесь.