Как упростить написание открытия, закрытия, удаления ордеров и улучшить наглядность программы

 

Сегодня возникла идея написать функцию для упрощения работы с ордерами. Вот что из этого получилось на ваш суд.

Это конечно первая версия, толком не оттестированная, но идея, я думаю, понятна. Можно еще, конечно, добавить модификацию ордеров, даже не добавляя параметров.

Реализация данной фукции работает с ордерами, у которых 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

Файлы:
order.mq4  8 kb
 
3.14:

Сегодня возникла идея написать функцию для упрощения работы с ордерами. Вот что из этого получилось на ваш суд.

Это конечно первая версия, толком не оттестированная, но идея, я думаю, понятна. Можно еще, конечно, добавить модификацию ордеров, даже не добавляя параметров.

Реализация данной фукции работает с ордерами, у которых 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

Если для получения опыта, то понимаю. А вообще то это попытка изобрести велосипед. Большой набор различных функций уже давно придуманы квалифицированными программистами и есть в свободном доступе.
 
khorosh:
Если для получения опыта, то понимаю. А вообще то это попытка изобрести велосипед. Большой набор различных функций уже давно придуманы квалифицированными программистами и есть в свободном доступе.


  Не спорю... Но по мне так лучше самому написать, чем искать иголку в стоге сена.
 

по мне так наоборот, чем больше параметров тем нагляднее..

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); выставляет любой ордер по парамерам

а с вашими цифрами через неделю забудешь ху из ху..

 
3.14:

Сегодня возникла идея написать функцию для упрощения работы с ордерами. Вот что из этого получилось на ваш суд.

////////////////////////////////////////////////////////////////////
//////////////////////// БЛОК ФУНКЦИЙ //////////////////////////////
////////////////////////////////////////////////////////////////////

/////////ФУНКЦИЯ ОТКРЫТИЯ, МОДИФИКАЦИИ И ЗАКРЫТИЯ ОРДЕРОВ///////////
//           Примеры использования:
//  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());
}

У Вас там несколько логических ошибок: неверное направление перебора, нет анализа ошибок при выделении ордера. Что определяем, если ордер не выбрался....

По сотне раз обсуждалось - поищите по форуму.
 
VladislavVG:

У Вас там несколько логических ошибок: неверное направление перебора, нет анализа ошибок при выделении ордера. Что определяем, если ордер не выбрался....

По сотне раз обсуждалось - поищите по форуму.



Не понял, почему не понравилось направление?

А по поводу   OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); даже в стандартном советнике MACD Sample нет анализа ошибок при выборе ордера

Не могу даже представить, чтобы  OrderSelect стал FALSE. Конечно, если быть занудой можно изменить типа:

if (!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) {Print("какой кошмар!!!"); return(0);} 

 
keekkenen:

по мне так наоборот, чем больше параметров тем нагляднее..

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 четвертый пост сверху (сон программиста).

Причина обращения: