закрытие сделки по тейк профиту

 

Уважаемые товарищи!

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

Каждый Ваш совет "+" в копилочку знаний, но желательно чем проще, тем лучше

 

желательно так:

появился сигнал-направлен ордер на открытие сделки-сделка открылась и ей присвоились ряд параметров-появилась позиция с рядом параметров-КАК В ДАЛЬНЕЙШЕМ РАБОТАТЬ С ПОЗИЦИЕЙ ЧТОБЫ ЕЕ ЗАКРЫТЬ?

 
Mikhail Gmyrov #:

желательно так:

появился сигнал-направлен ордер на открытие сделки-сделка открылась и ей присвоились ряд параметров-появилась позиция с рядом параметров-КАК В ДАЛЬНЕЙШЕМ РАБОТАТЬ С ПОЗИЦИЕЙ ЧТОБЫ ЕЕ ЗАКРЫТЬ?

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

информация об открытой позиции и ее параметрах хранится на торговом сервере

 
lynxntech #:

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

информация об открытой позиции и ее параметрах хранится на торговом сервере

это суть задачи, а как код написать. При написании кода и указании в параметрах ордера ТР значения, сделка не закрывается. Я читал, что для закрытия сделки надо как-то через обратный ордер писать

 
Mikhail Gmyrov #:

это суть задачи, а кк код написать

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

суть - получить текущую цену в зависимости от направления сделки, + или - указанное кол-во пунктов*на _Point, нормализовать цену и подставить в нужное поле OrderSend

покажите свой код, быстрее помогут

 

Хотелось бы такой код без всяких массивов, типа

ордеру присвоилось значение и это значение закрываем при разнице в цене + ТР

 

простая заготовка пример, для простого робота

сам не использую, нашел в архиве у себя, вроде рабочий вариант

#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade         trade;
CPositionInfo  position;
CSymbolInfo    symb;
//---
int Handle;
double Buffer_Up[];
double Buffer_Down[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!symb.Name(Symbol())) // sets symbol name
      return(INIT_FAILED);
   Handle=iCustom(Symbol(),PERIOD_CURRENT,"ind_name");
//--- Если не удалось получить хендл индикатора
   if(Handle==INVALID_HANDLE)
      Print("Не удалось получить хэндл индикатора_1 для символа "+_Symbol+"!");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Вывести в журнал причину деинициализации
   Print(reason);
   IndicatorRelease(Handle);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick(void)
  {
//--- Установим обратный порядок индексации (... 3 2 1 0)
   ArraySetAsSeries(Buffer_Up,true);
   ArraySetAsSeries(Buffer_Down,true);
//---
   if(CopyBuffer(Handle,0,1,30,Buffer_Up)==-1)
     {Print("Не удалось скопировать значения Handle"); return;}
   if(CopyBuffer(Handle,1,1,30 ,Buffer_Down)==-1)
     {Print("Не удалось скопировать значения Handle"); return;}
//---
   Trading();
  }
//+------------------------------------------------------------------+
//| Open position                                                                 |
//+------------------------------------------------------------------+
void Trading()
  {
   bool signal_Buy=true;
   bool signal_Sell=true;
//--- Получим цены ask и bid
   double _ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
   double _bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
   double _tp=0.0, _sl=0.0, _abc=0.0, _round=0.0, value=0.0;
//--- Узнаем, есть ли позиция
   bool pos_exists=PositionSelect(Symbol());
   ENUM_POSITION_TYPE pos_type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
   ENUM_ORDER_TYPE order_type=WRONG_VALUE;
//--- Если позиции нет
   if(!pos_exists)
     {
      //--- Сигнал на продажу :
      if(signal_Buy)
        {
         order_type=ORDER_TYPE_BUY;
         _sl=NormalizeDouble(value,_Digits);
         _abc=MathCeil((_ask-value)/_Point);
         _tp=NormalizeDouble(_ask+((_abc+50)*_Point),_Digits);
         //---
         if(_sl!=0.0)
            trade.Buy(0.1,Symbol(),0,_sl,_tp,"123");
        }
      //--- Сигнал на покупку :
      if(signal_Sell)
        {
         order_type=ORDER_TYPE_SELL;
         _sl=NormalizeDouble(value,_Digits);
         _abc=MathCeil((value-_bid)/_Point);
         _tp=NormalizeDouble(_bid-((_abc+50)*_Point),_Digits);
         //---
         if(_sl!=0.0)
            trade.Sell(0.1,Symbol(),0,_sl,_tp,"123");
        }
     }
//--- Если позиция есть
   if(pos_exists)
     {
     }
//---
  }
 
Mikhail Gmyrov #:

Хотелось бы такой код без всяких массивов, типа

ордеру присвоилось значение и это значение закрываем при разнице в цене + ТР

Здравствуйте, Михаил! Всё это есть в Справочнике MQL5. Попытайтесь его освоить и использовать, как настольную книгу.

А пока, вот Вам код:

//+------------------------------------------------------------------+
//|                                            Open_Position_Buy.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Input parameters                                                 |
//+------------------------------------------------------------------+
input ushort Stop_Loss=500;          //Стоп-лосс
input ushort Take_Profit=500;        //Тейк-профит
input ulong  Magic_Number=15430;     //Магическое число
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(!PositionSelect(_Symbol))
      Open_Pos_Buy();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Open_Pos_Buy()
  {
//--- объявим и инициализируем переменные запроса и результата
   MqlTradeRequest request;
   MqlTradeResult  result;
//--- обнулим переменные
   ZeroMemory(request);
   ZeroMemory(result);
//--- объявим и инициализируем переменную для цены позиции
   double price_position=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
//--- создадим параметры запроса на торговый сервер
   request.action   =TRADE_ACTION_DEAL;            // тип торговой операции
   request.symbol   =_Symbol;                      // символ
   request.volume   =0.1;                          // объем в 0.1 лот
   request.type     =ORDER_TYPE_BUY;               // тип ордера
   request.price    =price_position;               // цена для открытия
   request.deviation=5;                            // допустимое отклонение от цены
   request.magic    =Magic_Number;                 // MagicNumber ордера
   request.sl=price_position-Stop_Loss*_Point;     // стоп-лосс
   request.tp=price_position+Take_Profit*_Point;   // тейк-профит
//--- отправка запроса
   if(!OrderSend(request,result)) // если отправить запрос не удалось
      PrintFormat("OrderSend error %d",GetLastError()); // выведем код ошибки
//--- информация об операции
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }
//+------------------------------------------------------------------+

С уважением, Владимир.

 
MrBrooklin #:

Здравствуйте, Михаил! Всё это есть в Справочнике MQL5. Попытайтесь его освоить и использовать, как настольную книгу.

А пока, вот Вам код:

С уважением, Владимир.

а для кого тут разработчиками сделаны системные библиотеки?)

#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>

структуры типа

   MqlTradeRequest request;
   MqlTradeResult  result;

 явно не для Просто заполнить поля и отправить ордер на пересечениях 2-МА

 
MrBrooklin #:

Здравствуйте, Михаил! Всё это есть в Справочнике MQL5. Попытайтесь его освоить и использовать, как настольную книгу.

А пока, вот Вам код:

С уважением, Владимир.

Спасибо большое Владимир! То что надо!

 
lynxntech #:

а для кого тут разработчиками сделаны системные библиотеки?)

структуры типа

 явно не для Просто заполнить поля и отправить ордер на пересечениях 2-МА

Что Вы имеете ввиду?