Сегодня возникла идея написать функцию для упрощения работы с ордерами. Вот что из этого получилось на ваш суд.
Это конечно первая версия, толком не оттестированная, но идея, я думаю, понятна. Можно еще, конечно, добавить модификацию ордеров, даже не добавляя параметров.
Реализация данной фукции работает с ордерами, у которых MagicNumber = 12345. Это сделано для того, чтобы сохранить возможность ручного открытия ордеров и чтобы
эта функция их не трогала при автотрейдинге.
Примеры использования функции Order:
Order(0); закрывает все открытые ордера BUY и SELL
Order(0.001); закрывает все открытые ордера SELL (т.к. 0.001 меньше минимального лота)
Order(-0.001); закрывает все открытые ордера BUY (т.к. 0.001 меньше минимального лота)
Order(1.5); Открывает ордер BUY объёмом 1.5 лота без установления уровней профита и лосса
и при этом закрывает все открытые ордера SELL
Order(-1.5); - Открывает ордер SELL объёмом 1.5 лота без установления уровней профита и лосса
и при этом закрывает все открытые ордера BUY
Order(1.5,100,200); Открывает ордер BUY объёмом 1.5 лота, StopLoss-100 пунктов, TakeProfit-200 пунктов
и при этом закрывает все открытые ордера SELL
Order(1,100,200,OP_BUYLIMIT,300,120); - Открывает отложенный ордер BUYLIMIT на 300 пунктов ниже текущей
цены, объёмом 1 лот, StopLoss-100 пунктов, TakeProfit-200 пунктов, время жизни ордера 120 минут
Order(0,0,0,OP_BUYSTOP); удаляет все открытые ордера BUYSTOP
Если для получения опыта, то понимаю. А вообще то это попытка изобрести велосипед. Большой набор различных функций уже давно придуманы квалифицированными программистами и есть в свободном доступе.
Не спорю... Но по мне так лучше самому написать, чем искать иголку в стоге сена.
по мне так наоборот, чем больше параметров тем нагляднее..
closeAllOrders(SPREAD,TRY,TRADESLEEP,SHOWERRORS,SYMBOL,OP_MARKET); закрывает все открытые ордера BUY и SELL
closeAllOrders(SPREAD,TRY,TRADESLEEP,SHOWERRORS,SYMBOL,OP_BUY); закрывает все открытые ордера BUY
openOrder(SYMBOL, TYPE, LOT, PRICE, SLIPPAGE, SL, TP, COMMENT, MAGICNUMBER,ORDEREXPIRATION,TRY,TRADESLEEP,SHOWERRORS,CONVERTPRICE,MODIFYAFTEROPEN); выставляет любой ордер по парамерам
а с вашими цифрами через неделю забудешь ху из ху..
Сегодня возникла идея написать функцию для упрощения работы с ордерами. Вот что из этого получилось на ваш суд.
//////////////////////////////////////////////////////////////////// //////////////////////// БЛОК ФУНКЦИЙ ////////////////////////////// //////////////////////////////////////////////////////////////////// /////////ФУНКЦИЯ ОТКРЫТИЯ, МОДИФИКАЦИИ И ЗАКРЫТИЯ ОРДЕРОВ/////////// // Примеры использования: // Order(0); - закрывает все открытые ордера BUY и SELL // Order(0.001); - закрывает все открытые ордера SELL (т.к. 0.001 меньше минимального лота) // Order(-0.001); - закрывает все открытые ордера BUY (т.к. 0.001 меньше минимального лота) // Order(1.5); - Открывает ордер BUY объёмом 1.5 лота без установления уровней профита и лосса // и при этом закрывает все открытые ордера SELL // Order(-1.5); - Открывает ордер SELL объёмом 1.5 лота без установления уровней профита и лосса // и при этом закрывает все открытые ордера BUY // Order(1.5,100,200); - Открывает ордер BUY объёмом 1.5 лота, StopLoss-100 пунктов, TakeProfit-200 пунктов // и при этом закрывает все открытые ордера SELL // Order(1,100,200,OP_BUYLIMIT,300,120); - Открывает отложенный ордер BUYLIMIT на 300 пунктов ниже текущей // цены, объёмом 1 лот, StopLoss-100 пунктов, TakeProfit-200 пунктов, время жизни ордера 120 минут // Order(0,0,0,OP_BUYSTOP); - удаляет все открытые ордера BUYSTOP // // int Order(double volume, int StopLoss=0, int TakeProfit=0, int cmd=0, int delta=0, int expiration=0) { int ticket; int total=OrdersTotal(); if (total>0) { for(int cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol()==Symbol()) // инструмент совпадает? { if(OrderType()==OP_BUY && volume<=0 && cmd<2 && OrderMagicNumber()==12345) // открыта длинная позиция { if (OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)) Print("BUY ордер (",OrderTicket(),") закрыт по цене: ",OrderClosePrice()); // закрываем позицию else Print("ошибка закрытия BUY ордера (",OrderTicket(),") ошибка ",GetLastError()); } if(OrderType()==OP_SELL && volume>=0 && cmd<2 && OrderMagicNumber()==12345) // открыта короткая позиция { if (OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)) Print("SELL ордер (",OrderTicket(),") закрыт по цене: ",OrderClosePrice()); // закрываем позицию else Print("ошибка закрытия SELL ордера (",OrderTicket(),") ошибка ",GetLastError()); } if(OrderType()==OP_BUYLIMIT && volume==0 && cmd==OP_BUYLIMIT && OrderMagicNumber()==12345) { if (OrderDelete(OrderTicket())) Print("BUYLIMIT ордер (",OrderTicket(),") удален"); else Print("ошибка удаления BUYLIMIT ордера (",OrderTicket(),") ошибка ",GetLastError()); } if(OrderType()==OP_SELLLIMIT && volume==0 && cmd==OP_SELLLIMIT && OrderMagicNumber()==12345) { if (OrderDelete(OrderTicket())) Print("SELLLIMIT ордер (",OrderTicket(),") удален"); else Print("ошибка удаления SELLLIMIT ордера (",OrderTicket(),") ошибка ",GetLastError()); } if(OrderType()==OP_BUYSTOP && volume==0 && cmd==OP_BUYSTOP && OrderMagicNumber()==12345) { if (OrderDelete(OrderTicket())) Print("BUYSTOP ордер (",OrderTicket(),") удален"); else Print("ошибка удаления BUYSTOP ордера (",OrderTicket(),") ошибка ",GetLastError()); } if(OrderType()==OP_SELLSTOP && volume==0 && cmd==OP_SELLSTOP && OrderMagicNumber()==12345) { if (OrderDelete(OrderTicket())) Print("SELLSTOP ордер (",OrderTicket(),") удален"); else Print("ошибка удаления SELLSTOP ордера (",OrderTicket(),") ошибка ",GetLastError()); } } } } if (MarketInfo(Symbol(),MODE_MINLOT)>volume) return(OrdersTotal()); if(volume>0 && cmd<2) { ticket=OrderSend(Symbol(),OP_BUY,volume,Ask,3,(StopLoss!=0)*Bid-StopLoss*Point,(TakeProfit!=0)*Ask+TakeProfit*Point, NULL,12345,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); } if(volume<0 && cmd<2) { ticket=OrderSend(Symbol(),OP_SELL,-volume,Bid,3,(StopLoss!=0)*Ask+StopLoss*Point,(TakeProfit!=0)*Bid-TakeProfit*Point, NULL,12345,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); } if(volume>0 && cmd==OP_BUYLIMIT) { ticket=OrderSend(Symbol(),OP_BUYLIMIT,volume,Ask-delta*Point,3,(StopLoss!=0)*(Bid-(StopLoss+delta)*Point),(TakeProfit!=0)*(Ask+(TakeProfit-delta)*Point), NULL,12345,(expiration!=0)*TimeCurrent()+expiration*60,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUYLIMIT order opened : ",OrderOpenPrice()); } else Print("Error opening BUYLIMIT order : ",GetLastError()); } if(volume>0 && cmd==OP_SELLLIMIT) { ticket=OrderSend(Symbol(),OP_SELLLIMIT,volume,Bid+delta*Point,3,(StopLoss!=0)*(Ask+(StopLoss+delta)*Point),(TakeProfit!=0)*(Ask-(TakeProfit-delta)*Point), NULL,12345,(expiration!=0)*TimeCurrent()+expiration*60,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELLLIMIT order opened : ",OrderOpenPrice()); } else Print("Error opening SELLLIMIT order : ",GetLastError()); } if(volume>0 && cmd==OP_BUYSTOP) { ticket=OrderSend(Symbol(),OP_BUYSTOP,volume,Ask+delta*Point,3,(StopLoss!=0)*(Bid+(delta-StopLoss)*Point),(TakeProfit!=0)*(Ask-(-TakeProfit-delta)*Point), NULL,12345,(expiration!=0)*TimeCurrent()+expiration*60,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUYSTOP order opened : ",OrderOpenPrice()); } else Print("Error opening BUYSTOP order : ",GetLastError()); } if(volume>0 && cmd==OP_SELLSTOP) { ticket=OrderSend(Symbol(),OP_SELLSTOP,volume,Bid-delta*Point,3,(StopLoss!=0)*(Ask+(StopLoss-delta)*Point),(TakeProfit!=0)*(Ask-(TakeProfit+delta)*Point), NULL,12345,(expiration!=0)*TimeCurrent()+expiration*60,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELLSTOP order opened : ",OrderOpenPrice()); } else Print("Error opening SELLSTOP order : ",GetLastError()); } return(OrdersTotal()); }
У Вас там несколько логических ошибок: неверное направление перебора, нет анализа ошибок при выделении ордера. Что определяем, если ордер не выбрался....
У Вас там несколько логических ошибок: неверное направление перебора, нет анализа ошибок при выделении ордера. Что определяем, если ордер не выбрался....
Не понял, почему не понравилось направление?
А по поводу OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); даже в стандартном советнике MACD Sample нет анализа ошибок при выборе ордера.
Не могу даже представить, чтобы OrderSelect стал FALSE. Конечно, если быть занудой можно изменить типа:
if (!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) {Print("какой кошмар!!!"); return(0);}
по мне так наоборот, чем больше параметров тем нагляднее..
closeAllOrders(SPREAD,TRY,TRADESLEEP,SHOWERRORS,SYMBOL,OP_MARKET); закрывает все открытые ордера BUY и SELL
closeAllOrders(SPREAD,TRY,TRADESLEEP,SHOWERRORS,SYMBOL,OP_BUY); закрывает все открытые ордера BUY
openOrder(SYMBOL, TYPE, LOT, PRICE, SLIPPAGE, SL, TP, COMMENT, MAGICNUMBER,ORDEREXPIRATION,TRY,TRADESLEEP,SHOWERRORS,CONVERTPRICE,MODIFYAFTEROPEN); выставляет любой ордер по парамерам
а с вашими цифрами через неделю забудешь ху из ху..
Назови красиво переменные - и все будет понятно. Цифры даны только для примера. См. переменные в описании функции.
И по-моему лучше дружить с "сестрой таланта". "Не думайте, что в многословии своем будете услышаны".
Вы бы лучше прислушались к советам сведующих... хотя это ваше право.
улучшить наглядность говорите? ;)
что более наглядно и понятно при прочтении кода? (выберите правильный вариант)
1) CloseAllMarketOrders(); Open(OP_BUY, 0.03, "EURUSD")
2) Order(0); Order(0.03);
к томуже: достаточно одного неловкого движения клавишей BackSpace и команда открытия ордера Order(0.03) превратится в команду закрытия Order(0.0) и компилятор не выругается да и вы сразу это место не найдете ;)
если топикстартер решил серьезно улучшить наглядность, тогда ознакомьтесь с азами
возможно Вам и понятно и наглядно и привыкли Вы так, но есть просто общепринятые правила в программировании, что бы можно было частью кода "поделиться с кем", даже не представляю как у Вас чтонить взять, чтобы было быстрее, чем самостоятельно написать
https://forum.mql4.com/ru/11381/page155#334411 четвертый пост сверху (сон программиста).
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Сегодня возникла идея написать функцию для упрощения работы с ордерами. Вот что из этого получилось на ваш суд.
Это конечно первая версия, толком не оттестированная, но идея, я думаю, понятна. Можно еще, конечно, добавить модификацию ордеров, даже не добавляя параметров.
Реализация данной фукции работает с ордерами, у которых MagicNumber = 12345. Это сделано для того, чтобы сохранить возможность ручного открытия ордеров и чтобы
эта функция их не трогала при автотрейдинге.
Примеры использования функции Order:
Order(0); закрывает все открытые ордера BUY и SELL
Order(0.001); закрывает все открытые ордера SELL (т.к. 0.001 меньше минимального лота)
Order(-0.001); закрывает все открытые ордера BUY (т.к. 0.001 меньше минимального лота)
Order(1.5); Открывает ордер BUY объёмом 1.5 лота без установления уровней профита и лосса
и при этом закрывает все открытые ордера SELL
Order(-1.5); - Открывает ордер SELL объёмом 1.5 лота без установления уровней профита и лосса
и при этом закрывает все открытые ордера BUY
Order(1.5,100,200); Открывает ордер BUY объёмом 1.5 лота, StopLoss-100 пунктов, TakeProfit-200 пунктов
и при этом закрывает все открытые ордера SELL
Order(1,100,200,OP_BUYLIMIT,300,120); - Открывает отложенный ордер BUYLIMIT на 300 пунктов ниже текущей
цены, объёмом 1 лот, StopLoss-100 пунктов, TakeProfit-200 пунктов, время жизни ордера 120 минут
Order(0,0,0,OP_BUYSTOP); удаляет все открытые ордера BUYSTOP