Вопросы (Yerkin Sagandykov) - страница 5

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

OnTradeTransaction

Yerkin Sagandykov, 2024.10.25 22:31

не могу в трех соснах разобраться) Надо чтоб при исполнении  лимитного  ордера , ТП у окттых ордеров ТП менялся. При этом трейдер сам также может откывать ордер. Что не так  в коде ?


void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result)
  {
    Print("Запуск OnTradeTransaction type = ", trans.type," trans.order_type ", trans.order_type, " ", trans.type == TRADE_TRANSACTION_ORDER_ADD);

    // Обработка сделок
      if (trans.type == TRADE_TRANSACTION_DEAL_ADD) {
         if (trans.order_type == ORDER_TYPE_BUY) {
             Print("Пользователь открыл новый ордер на покупку.");
             return;
         }
      }
    
    if (trans.type == TRADE_TRANSACTION_DEAL_ADD)
    {
        
        // Проверка на исполнение лимитного ордера
        if (trans.order_type == ORDER_TYPE_BUY_LIMIT || trans.order_type == ORDER_TYPE_SELL_LIMIT)
        {
            double new_tp = trans.price; // Новый TP на основе цены сработавшего ордера
            Print("Сработал лимитный ордер, новый TP = ", new_tp);
            UpdateTakeProfitForPositions(new_tp);
        }
        
        // Закрытие всех позиций и удаление всех ордеров, если это не закрытие по TP
        else if (PositionCloseCheck(trans))
        {
            Print("Закрытие всех позиций и удаление всех ордеров");
            CloseAllOrders();  // Закрытие всех позиций и удаление всех ордеров
            isOpenOrder = false;  // !!!для теста
        }
    }
  }

//+------------------------------------------------------------------+
// Проверка на закрытие позиции
bool PositionCloseCheck(const MqlTradeTransaction &trans)
  {
   Print("Проверка закрытия позиции: trans.order = ", trans.order, ", trans.price = ", trans.price);
   return trans.order > 0 && trans.price > 0;
  }

// Функция для обновления TP всех открытых позиций
void UpdateTakeProfitForPositions(double new_tp)
  {
   Print("начинается устанвока новых тейк профит new_tp = ", new_tp);
   for(int i = PositionsTotal() - 1; i >= 0; i--)
     {
      if(PositionSelect(PositionGetSymbol(i)))
        {
         if(PositionGetInteger(POSITION_MAGIC) == MagicNumber && PositionGetSymbol(i) == a_symbol.Name())
           {
            // Обновляем TP каждой позиции
            a_trade.PositionModify(PositionGetSymbol(i), 0, new_tp); // Установка нового TP
            Print("тейк профит new_tp = ", new_tp);
           }
        }
     }
  }

// Функция для закрытия всех ордеров
void CloseAllOrders()
  {
   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      if(order.SelectByIndex(i))
        {
         if(order.Magic() == MagicNumber && order.Symbol() == a_symbol.Name())
           {
            if(order.OrderType() == ORDER_TYPE_BUY_LIMIT || order.OrderType() == ORDER_TYPE_SELL_LIMIT)
              {
               a_trade.OrderDelete(order.Ticket());
               Print("Удалён лимитный ордер: ", order.PriceOpen());
              }
           }
        }
     }
  }


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

OnTradeTransaction

JRandomTrader, 2024.10.26 00:32

Вероятно, не так примерно всё.

Для начала, следует ещё раз разобраться с ордерами, сделками, позициями. В частности, один ордер может порождать несколько сделок. По этому, КМК, лучше всего отслеживать исполнение ордера по попаданию его в историю.

Также, согласно документации, для транзакций типа TRADE_TRANSACTION_DEAL_* поле order_type не заполняется и проверять его нет смысла.

Далее, стоит разобраться неттинг/хеджинг.  "Функция для обновления TP всех открытых позиций" предполагает, что на символе позиций может быть несколько, как при хеджинге. Но установка нового TP происходит с указанием символа, а не тикета позиции, т.е., как при неттинге.

Это только то, что сразу бросилось в глаза.


 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Comment в неактивном окне

Yerkin Sagandykov, 2021.08.09 18:50

Всем привет !

прохожу по циклу по окнам, обрабатываю данные. и надо вывести информацию в этом окне, типа коммента..


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Comment в неактивном окне

Ihor Herasko, 2021.08.09 19:18

Проще всего создать графический объект. У каждой из функций ObjectXXX первым аргументом следует идентификатор чарта. Так что проблем нет.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Comment в неактивном окне

Alexey Viktorov, 2021.08.09 21:55

//+------------------------------------------------------------------+ 
//| Функция устанавливает текст комментария в левом верхнем углу     | 
//| графика.                                                         | 
//+------------------------------------------------------------------+ 
bool ChartCommentSet(const string str,const long chart_ID=0) 
  { 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- установим значение свойства 
   if(!ChartSetString(chart_ID,CHART_COMMENT,str)) 
     { 
      //--- выведем сообщение об ошибке в журнал "Эксперты" 
      Print(__FUNCTION__+", Error Code = ",GetLastError()); 
      return(false); 
     } 
//--- успешное выполнение 
   return(true); 
  }
Надо читать документацию и чуток думать.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

определение шаблона поведения цены

Yerkin Sagandykov, 2021.09.13 09:10

Всем привет !

надо  описать в коде поведение цен на протяжении недели. чтоб аналогичные движения определить на истории.   

возможно ли это сделать на сновании какого либо индикатора (ов) или просто мат. анализом изменения цен ?


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

определение шаблона поведения цены

Ihor Herasko, 2021.09.13 20:58

Вариантов масса, начиная от обычных свечных паттернов и заканчивая функцией цены. Какой использовать, Вам выбирать.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

высчитать количество часов

Yerkin Sagandykov, 2018.03.20 13:00

Всем привет !

по логике советника мне надо понять за какое кол-во  часов закрылся ордер. как высчитать ? 

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

void OnStart()

  {
//---
         
      int  dCurr = TimeHour( Time[0]);   //     D'2018.01.18 10:00:00' ;    //08:56:39' ;  
      int dOpen = TimeHour(D'2018.03.12 11:24:00') ;  
      
      int dd = dCurr - dOpen;
   
      
      Alert(dd);
  }



Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

высчитать количество часов

FXwin, 2018.03.20 15:54

Не проверял!!

bool op;

void start() {

  datetime tOp=0,TimeOp=0;
  for(int i=OrdersTotal()-1;i>=0;i--)
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){
  if(tOp<OrderOpenTime()) tOp=OrderOpenTime();}
//---
  datetime tCl=0;
   for(i=OrdersHistoryTotal()-1;i>=0;i--) 
   if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
   if(tCl<OrderCloseTime()) tCl=OrderCloseTime();}
//---
   int res=0;
   if(tOp!=0 && op) {TimeOp=tOp;op=false;}
   if(tOp!=0 && tOp!=TimeOp) op=true;
   if(tCl>TimeOp) res=TimeHour(tCl-TimeOp);
   Print("© Результат = ",res," ");

}//StartEND

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

ChartOpen - открывается новое окно

Yerkin Sagandykov, 2019.12.16 11:53

Здравствуйте ! 

в коде необходимо активировать существующее окно и  нарисовать в нем же линию. В тестере нормально было, а в реале открывается новое окно ...

    long tempIdGrafik=ChartOpen(nameSym,Period_L);

   
      nameLineV = DoubleToStr(mColor) + "V_" + TimeToStr(TimeCurrent());  
        
      ObjectCreate(nameLineV,OBJ_VLINE, 0,Time[mBar],0);                
      ObjectSet(nameLineV,OBJPROP_WIDTH,mWidth);
      ObjectSet(nameLineV, OBJPROP_COLOR, mColor);

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

ChartOpen - открывается новое окно

Yerkin Sagandykov, 2019.12.16 12:42

вопрос не корректный тогда с моей стороны

каким образом сделать, чтобы в нужном окне нарисовать линию ? проблема в том ,что линия рисуется в нужном окне  но новое окно открывается , что нежелательно ...


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

ChartOpen - открывается новое окно

Artyom Trishkin, 2019.12.16 13:31

Найти нужный график по ChartID() при помощи поиска нужного графика. И при рисовании линии обязательно указывать идентификатор графика.


 
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

bases

Yerkin Sagandykov, 2024.10.23 22:16

Всем привет !

база котировок установлен на диске С C:\Users\User\AppData\Roaming\MetaQuotes\Terminal\908CDDF6DDEF089609CFD48700109B47\config\, но места совсем мало стало - как переназначить на диск D, не переустанавливая прогу ?


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

bases

Ihor Herasko, 2024.10.24 08:47

Котировок в папке config нет. Там находятся общие настройки и сертификаты. История котировок хранится в папке history. В том случае, если терминал установлен на диск D, то достаточно при запуске терминала указать ключ /portable. Предварительно в папку МТ нужно скопировать необходимые данные. Если речь о котировках, то скопировать папку history. Папку config тоже не помешает скопировать, но на котировки это никак не повлияет.

Если же и сам терминал установлен на диске С, то поможет только переустановка. Дело ведь несложное. Достаточно всю информацию сохранить и после установки поместить в новую папку терминала. Запускать также - с ключом /portable.


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

bases

Yerkin Sagandykov, 2024.10.24 09:29

спасибо Игорь ! 
но сделал через создания ярлыка mklink  и физически перенес на другой диск


 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

OnTradeTransaction - limit order

Yerkin Sagandykov, 2024.11.04 19:46

void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result)
  {
   Print("Запуск OnTradeTransaction"," Total() = ", PositionsTotal());
    if (trans.type == TRADE_TRANSACTION_DEAL_ADD) {
      for(int i = 0; i <= PositionsTotal() -1 ; i++)  // PositionsTotal() - 1 - единицу дулали чтоб послдений ордер который открылс яне попадал
     {
      
      
      if(PositionSelect(PositionGetSymbol(i)))
        {
         ulong ticket = PositionGetTicket(i); 
         if(PositionSelectByTicket(ticket))   
           {
           if(PositionGetInteger(POSITION_MAGIC) == magicOrd && PositionGetString(POSITION_SYMBOL) == a_symbol.Name())
              {
               string comment = PositionGetString(POSITION_COMMENT);
               Print("i = ", i,  " Comment: ", comment);
              }
           }
        }
     }
    }
   
  }

Привет всем !

как определить что сработал лимитный ордер ? думал по комментарию ,но как то не красиво )


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

OnTradeTransaction - limit order

Edgar Akhmadeev, 2024.11.04 22:41

Самый лучший способ изучить процессы - запустить их и поработать с отладчиком.

"Не давай им рыбу, дай им сеть"


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

OnTradeTransaction - limit order

Denis Kirichenko, 2024.11.04 23:52

Не ленитесь, посмотрите в статьях, их есть несколько на ресурсе. К примеру Рис.15

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

OnTradeTransaction - limit order

JRandomTrader, 2024.11.05 00:26

Сорри, но вспомнилось: "Чтобы научиться программировать, возьмите дизассемблер и посмотрите, как это делают другие" ))


 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

TERMINAL_DATA_PATH

Yerkin Sagandykov, 2024.11.26 18:46

string FindFileStartingWithUnderscore()
  {
// Получаем путь к папке Files
   string folderPath1 = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files\\";
   
   
   Print("Folder Path: ", folderPath," ", folderPath);

   if(FileIsExist(folderPath))
     {
      Print("Directory exists: ", folderPath);
     }
   else
     {
      Print("Directory does not exist or access is restricted: ", folderPath);
     }
// Открываем папку для поиска файлов
   string fileName = "";
   long searchHandle = FileFindFirst("*", fileName, FILE_COMMON);   // Ищем первый файл

// Проверяем, что поиск прошел успешно
   if(searchHandle == INVALID_HANDLE)
     {
      Print("Error opening directory. Error code: ", GetLastError());
      return "";
     }

// Перебираем файлы
   while(FileFindNext(searchHandle, fileName))
     {      // Проверяем, начинается ли имя файла с "_"
      if(StringSubstr(fileName, 0, 1) == "_")
        {
         Print("Found file: ", fileName);
         FileFindClose(searchHandle);  // Закрываем хендл поиска
         return fileName; // Возвращаем имя файла
        }
     }

// Если файл не найден
   FileFindClose(searchHandle);  // Закрываем хендл поиска
   Print("No file starting with '_' found.");
   return "";
  }

Всем привет !

почему пишет ошибку ?

Directory does not exist or access is restricted: C:\Users\User\AppData\Roaming\MetaQuotes\Terminal\908CDDF6DDEF089609CFD48700109B47\MQL5\Files\
хотя папка есть  ? доступ тоже



 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

TERMINAL_DATA_PATH

Yerkin Sagandykov, 2024.12.05 20:02

  bool isTester = MQLInfoInteger(MQL_TESTER);

    if(isTester)
      filename = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files\\" + filename;

Привет всем !

При работе советника он обращается к указанной папке , и надо чтоб и в режиме тестирование обращался к указа заной папке . Но проблема что  при тестировании у него 

TERMINAL_DATA_PATH

другой путь генерится . Когда хочу в COMMON папку то ошибку дает  (режим тестирования) - Error opening file for reading. Error code: 5002