Как правильно оформить новую структура запроса? - страница 2

 
Mikalas:

А в классе - куча мусора, который съедает время.

И перекомпилить придётся в обоих случаях.

Чем проще код - тем лучше! 

Последний раз, когда писал здесь что-то про повышение быстродействия, мне ответили, что незачем себя лишать удобства, т.е. опять я был не прав.

С чем связана такая особая потребность в повышении быстродействия? Не так часто вызывается функция открытия позиции, чтобы это как-то заметно повлияло на тестирование. Если повышение скорости открытия в реале... не знаю на что могут повлиять пол миллисекунды. Очень интересно на что? Если так сражаться за быстродействие, стоит отказаться и от функций, для каждого случая писать включаемые файлы. (Но и на этот тезис мне сечас конечно возразят, что мол компилятор все оптимизирует).

В одном случая придется только перекомпилировать, а в другом делать исправление, но сначала разобраться, в чем же дело. Такая вот небольшая разница.

Проще, чем три строчки: подключить, объявить, вызывать. 

 
Mikalas:

Исправте:

 на 

   А на что это должно было повлиять?
   Исправил - но результат тот же.
   Позиции отказываются докупаться.
   (но стопы и тейк профиты выставляются правильно.)
 

Mike_Kharkov!

Чтобы помочь вам, нужно следующее:

1. Лаконично и точно написать что вы хотите.

2. Приложить не кусок, а смысловую часть кода.

3. Вы денежку проверяете? 

 
Integer:

Последний раз, когда писал здесь что-то про повышение быстродействия, мне ответили, что незачем себя лишать удобства, т.е. опять я был не прав.

С чем связана такая особая потребность в повышении быстродействия? Не так часто вызывается функция открытия позиции, чтобы это как-то заметно повлияло на тестирование. Если повышение скорости открытия в реале... не знаю на что могут повлиять пол миллисекунды. Очень интересно на что? Если так сражаться за быстродействие, стоит отказаться и от функций, для каждого случая писать включаемые файлы. (Но и на этот тезис мне сечас конечно возразят, что мол компилятор все оптимизирует).

В одном случая придется только перекомпилировать, а в другом делать исправление, но сначала разобраться, в чем же дело. Такая вот небольшая разница.

Проще, чем три строчки: подключить, объявить, вызывать. 

Вы правильно заметили: "MQ что-то изменили"...

Если сам написал, то за 2 минуты поймёшь в чём дело! 

 
Mikalas:

Mike_Kharkov!

Чтобы помочь вам, нужно следующее:

1. Лаконично и точно написать что вы хотите.

2. Приложить не кусок, а смысловую часть кода.

3. Вы денежку проверяете? 

   1) Хочу что бы код работал на демо счете точно так же, как во время тестирования на истории.
   2) Прикладываю весь код + оранжевым пометил то, что считаю смысловым.
//+------------------------------------------------------------------+
//|                                                  My_Practics.mq5 |
//+------------------------------------------------------------------+
#property copyright "Mike_Kharkov"
#property link      "https://www.fl.ru/users/Yamaradg/"
#property version   "1.00"

double COEF  = 1.0;                                              //коэффициент кратности увеличения лота
int    DELTA = 20;                                              //количество пунктов прохода цены для уведичения позиции
int    counter = 0;                                              //счетчит вызовов функции
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+


int OnInit()
{

//---
   
//---
   return(INIT_SUCCEEDED);
}//---------------------------------------------------------------------------+



//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+


void OnDeinit(const int reason)
{
//---
}//---------------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+


void OnTick()
{ 
   // вызываем функцию вычисления последнего ордера и преобразовываем результат в 5-ти значное число.
      double last_order = FindLastPrice(ORDER_TYPE_BUY);
      
   int positions_total = PositionsTotal();
  
//---блок первоначального окрытия позиции по текущей цене
   if(PositionsTotal() < 1)
   {
      double prc = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
      counter = 0;

      // вызываем функцию, подсчитывающую кол-во лотов для стартовой сделки
      double trade_lot = function_trade_lot(AccountInfoDouble(ACCOUNT_BALANCE));
      
      // -------+ вызов функции формирования торгового запроса +--------- 
      bool isOpen = SendOrder(prc, trade_lot);
 
       
      if (isOpen)
      {
         Print("         Первоначальное открытие               ");
   
         if (PositionSelect(Symbol()))
         {
            double priceOpen = PositionGetDouble(POSITION_PRICE_OPEN);
            double posTP     = PositionGetDouble(POSITION_TP);
            double posProf = PositionGetDouble(POSITION_PROFIT);
            double accountMargin = AccountInfoDouble(ACCOUNT_MARGIN_SO_SO);
            double accountBalance = AccountInfoDouble(ACCOUNT_BALANCE);
            double AccountEquity = AccountInfoDouble(ACCOUNT_EQUITY);
            
            Print("                        ");
            Print("Количество открытых позиций: ", PositionsTotal());
            Print("Цена в сделке, подтверждённая брокером : ", DoubleToString(priceOpen, 5));
            Print("Тэйк-Профит позиции : ", DoubleToString(posTP, 5));
            Print("Порядковый номер вызова ф-ции: ", counter,"-я функция.");
            Print("Текущая прибыль позиции: ", DoubleToString(posProf, 2), " $");
            Print("СТОП АУТ: ", DoubleToString(accountMargin, 2), " %");
            Print("Баланс аккаунта: ", DoubleToString(accountBalance, 2), " $");
            Print("Средства на счете: ", DoubleToString(AccountEquity, 2), " $");
            Print("                        ");
         }
      }
      return;
   }
      


//---блок наращивания существующей позиции
  
   double ask           = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double posVolume     = PositionGetDouble(POSITION_VOLUME);
   
   
   // условие для наращивания позиции
   if(ask <= last_order - DELTA * _Point && PositionsTotal() == 1)
   {
      double prc = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
      //увеличим размер позиции на коэффициент
      double lot = posVolume * COEF;
      
      // -------+ вызов функции формирования торгового запроса +--------- 
      bool isOpen = SendOrder(prc, lot);
       
      if (isOpen)
      {
         Print("          Увеличение объема позиции              ");
         Print(" Цена по которой открываем ордер : ", DoubleToString(ask, 5));
         Print(" Объем открываемого ордера : ", DoubleToString(lot, 2));
         
         if (PositionSelect(Symbol()))
         {
            posVolume    = PositionGetDouble(POSITION_VOLUME);
            double posTP = PositionGetDouble(POSITION_TP);
            double posProf = PositionGetDouble(POSITION_PROFIT);
            double accountMargin = AccountInfoDouble(ACCOUNT_MARGIN_SO_SO);
            double accountBalance = AccountInfoDouble(ACCOUNT_BALANCE);
            double AccountEquity = AccountInfoDouble(ACCOUNT_EQUITY);
            
            Print("                        ");
            Print("          Данные после открытия ордера              ");
            Print("Количество открытых позиций: ", PositionsTotal());
            Print("Оъем открытой позиции после открытия ордера : ", DoubleToString(posVolume, 2));
            Print("Тэйк-Профит позиции : ", DoubleToString(posTP, 5));
            Print("Цена последней сделки: ", DoubleToString(last_order, 5));
            Print("Порядковый номер вызова ф-ции: ", counter,"-я функция.");
            Print("Текущая прибыль позиции: ", DoubleToString(posProf, 2), " $");
            Print("СТОП АУТ: ", DoubleToString(accountMargin, 2), " %");
            Print("Баланс аккаунта: ", DoubleToString(accountBalance, 2), " $");
            Print("Средства на счете: ", DoubleToString(AccountEquity, 2), " $");
            Print("                        ");
         }
      }
      return;
   }
//---
   
}//---------------------------------------------------------------------------+



//функция формирующая торговый запрос на открытие позиции  -------------------+
//и проверки результата открытия
bool SendOrder(double price, double volume)
{
   if(volume >= 100000){
   return(false);
   Print("ОШИБКА! Обьем Ордера привысил размер 100-ни лотов и сейчас ровняется", volume,"-м");
   };
   
   counter++;
   MqlTradeRequest request = {0};
   MqlTradeResult  result  = {0};
   //---заполняем поля торгового запроса
   request.action       = TRADE_ACTION_DEAL;       // Тип выполняемого действия
   request.symbol       = _Symbol;                 // Имя торгового инструмента
   request.volume       = volume;                  // Запрашиваемый объем сделки в лотах
   request.price        = price;                   // Цена  
   request.type         = ORDER_TYPE_BUY;          // Тип ордера
   request.tp           = price + 27*_Point;       // Цена, по которой сработает Take Profit ордер при движении цены в благоприятном направлении
   request.sl           = price - 275*_Point;     // Цена, по которой сработает Stop Loss ордер при движении цены в неблагоприятном направлении
   request.deviation    = 1000000;                 // Максимально приемлемое отклонение от запрашиваемой цены, задаваемое в пунктах
   request.type_filling = ORDER_FILLING_IOC;       // Тип ордера по исполнению
   request.type_time    = ORDER_TIME_GTC;
   
 
//---проверим хватает ли средств для открытия позиции
   double margin = 0.0;
   
   if (!OrderCalcMargin(request.type, request.symbol, request.volume, request.price, margin))
      return(false);
   
   if (margin > AccountInfoDouble(ACCOUNT_FREEMARGIN))
      return(false);

   
//---отправка запроса на сервер и проверка результата отправки
   if (OrderSend(request,result))
      {
      return(true);
      }
   else
      Alert("При выставлении ордера произошла ошибка. Error = ",GetLastError());
      Print(__FUNCTION__,"   При выставлении ордера произошла ошибка. Error = ",GetLastError());
                                    
   return(false);
}//-------------------------------------------------------------------------------------------------+




// возвращает цену открытия последнего ордера, где nMode - ORDER_TYPE_BUY/ORDER_TYPE_SELL ----------+
// для позиции с идентификатором PositionID
double FindLastPrice(int nMode)
  {
    int  CntPos;               // количество ордеров в истории
    ulong nTicket;             // тикет выбранного ордера из истории
    ulong OldTicket = 0;       // тикет ордера найденного ранее
    long PosID, PosiID;        // идентификатор позиции, к которой относится выбранный ордер
    //long Magic;              // магический номер
    long Type;                 // тип найденного ордера (Buy или Sell)
    double OrderPrice = 0;     // найденная цена
    // идентификатор позиции
    if((PosiID = PositionGetInteger(POSITION_IDENTIFIER))==0) return(0.0);
    
    // создадим список ордеров и сделок, находящихся в истории
    HistorySelect(0, TimeCurrent());
    
    CntPos = HistoryOrdersTotal(); // количество ордеров в истории
    
    // переберем все ордеры истории и отберем те, что относятся к нашей открытой позиции
    for (int i = 0; i < CntPos; i++)
      {
        nTicket = HistoryOrderGetTicket(i);  // получим тикет очередного ордера
        PosID  = HistoryOrderGetInteger(nTicket, ORDER_POSITION_ID);  // позиция ордера
        Type   = HistoryOrderGetInteger(nTicket, ORDER_TYPE);         // тип ордера
        
        if ((PosID == PosiID) && (Type == nMode)) 
          {
            if (nTicket > OldTicket)  // этот ордер был открыт позже найденного ранее
              {
                OrderPrice = HistoryOrderGetDouble(nTicket, ORDER_PRICE_OPEN); // цена открытия ордера
                OldTicket = nTicket; // запомним тикет
              };
          };
      };
      
    return(OrderPrice);
  };//---------------------------------------------------------------------------+

  
// ---- функция подсчета значения стартового лота. ------------------------------+

       double function_trade_lot(double account_balance ){
       
          double lot = 0.01;
          
          //lot = NormalizeDouble(0.01+MathMax(MathFloor((account_balance-30000)/100),0)*0.01,2);
          
          //lot = MathMin(lot, SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX));
          
          
    return(lot);
  
  };//---------------------------------------------------------------------------+
3) Тоже пометил оранжевым. (рядом с остальным.)
 

Тёзка, вообще все не правильно делаешь!

Дай скайп в личку, здесь долго объяснять 

 
Mikalas:

Вы правильно заметили: "MQ что-то изменили"...

Если сам написал, то за 2 минуты поймёшь в чём дело! 

Дааа... Извините, конечно, но кажется здесь на форуме массовый психоз - "в любом случае объясните Integer'у, что он не прав".  Прям чемпионат мира какой-то.
 
Integer:
Дааа... Извините, конечно, но кажется здесь на форуме массовый психоз - "в любом случае объясните Integer'у, что он не прав".  Прям чемпионат мира какой-то.

 

- Доктор, по мне бегают маленькие крокодильчики!

- Пациент, что Вы себе позволяете?! Не надо их на меня перекидывать!

 
Contender:

 

- Доктор, по мне бегают маленькие крокодильчики!

- Пациент, что Вы себе позволяете?! Не надо их на меня перекидывать!

Ты несомненный лидер в этом чемпионате.
 
Миша, не забудь проверять деньги, перед отсылкой ордера!
Причина обращения: