Что я прописал не так?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexsandr San
1990
Alexsandr San  
//+------------------------------------------------------------------+
//|                                                      sl tp 0.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
//---
CTrade        ExtTrade;    // trading object
CPositionInfo Extposition; // trade position object
//---
input double              InpStopLoss0           = 3;                // Stop Loss
input double              InpTakeProfit0         = 4;                // Take Profit

double   prPos,n=10.0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
      if(PositionSelect(Symbol()))
        {
         prPos=(PositionGetDouble(POSITION_PROFIT)/PositionGetDouble(POSITION_VOLUME)/SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE))/n;
        }
   else
     {
      prPos=0;
     }
   if(prPos<-InpStopLoss0 || prPos>InpTakeProfit0)
     {
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
         ExtTrade.PositionClose(Extposition.Ticket());
     }
  }
//+------------------------------------------------------------------+
с одной позицией на одном символе - работает нормально.

а если несколько позиций - не закрывает как нужно.

Может кто подскажет - как правильно прописать код ? 

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь...
Файлы:
sl_tp_0.mq5 3 kb
Vladimir Karputov
Модератор
163883
Vladimir Karputov  
Aleksandr Klapatyuk:

Пожалуйста, старайтесь вставить код правильно:

Кнопка  Исходный код предназначена для вставки исходного кода в текст сообщения. При нажатии появляется пустое окно, в которое необходимо вставить код и далее нажать кнопку  Вставить. Для отмены вставки кода необходимо нажать кнопку Отмена.

Вставка исходного кода в сообщение

Исходный код, вставленный таким образом, будет красиво отформатирован моноширинным шрифтом, удобным для восприятия подобного рода информации.

Исходный код в тексте сообщения

Не рекомендуется выделять код полужирным шрифтом, чтобы выделить как-то по смыслу определенные куски. Дело в том, что в разных операционных системах и браузерах моноширинные шрифты отображаются по-разному. Например, в Windows Vista используется моноширинный шрифт Consolas, у которого полужирное начертание для 10 размера практически не отличимо от обычного.

Alexsandr San
1990
Alexsandr San  
Vladimir Karputov:

Пожалуйста, старайтесь вставить код правильно.

Извините - сейчас подправлю 

Vladimir Karputov
Модератор
163883
Vladimir Karputov  

Необходимо обходить весь список позиций:

   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positions
      if(m_position.SelectByIndex(i))     // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
           {
            double profit=m_position.Commission()+m_position.Swap()+m_position.Profit();
            if(profit<-InpStopLoss0 || profit>InpTakeProfit0)
               m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
           }
Alexsandr San
1990
Alexsandr San  
Vladimir Karputov:

Необходимо обходить весь список позиций:

Спасибо вам огромное! а то уже не один год- мучаюсь над этим кодом.

Здоровья и всех благ!

Vladimir Karputov
Модератор
163883
Vladimir Karputov  
Aleksandr Klapatyuk:

Спасибо вам огромное! а то уже не один год- мучаюсь над этим кодом.

Здоровья и всех благ!

Что означают и как объявлять переменные m_position, m_symbol вопросов не вызывает? Или пояснить?

Alexsandr San
1990
Alexsandr San  
Vladimir Karputov:

Что означают и как объявлять переменные m_position, m_symbol вопросов не вызывает? Или пояснить?

Нет - я всё разберусь. Спасибо!

Alexsandr San
1990
Alexsandr San  
Vladimir Karputov:

Что означают и как объявлять переменные m_position, m_symbol вопросов не вызывает? Или пояснить?

//+------------------------------------------------------------------+
//|                                                      sl tp 0.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.01"

#define MACD_MAGIC 0
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
//---
double            m_adjusted_point;             // point value adjusted for 3 or 5 points
CTrade            m_trade;                      // trading object
CSymbolInfo       m_symbol;                     // symbol info object
CPositionInfo     m_position;                   // trade position object
CAccountInfo      m_account;                    // account info wrapper
//---
input double              InpStopLoss0           = 3;                // Stop Loss
input double              InpTakeProfit0         = 4;                // Take Profit

double profi,n=10.0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- initialize common information
   m_symbol.Name(Symbol());                  // symbol
   m_trade.SetExpertMagicNumber(MACD_MAGIC); // magic
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(Symbol());
//--- tuning for 3 or 5 digits
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positions
      if(m_position.SelectByIndex(i))     // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==MACD_MAGIC)
           {
            profi=(PositionGetDouble(POSITION_PROFIT)/PositionGetDouble(POSITION_VOLUME)/SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE))/n;
            if(profi<-InpStopLoss0 || profi>InpTakeProfit0)
               m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
           }
  }
//+------------------------------------------------------------------+
Alexsandr San
1990
Alexsandr San  
Aleksandr Klapatyuk:

Vladimir Karputov

ещё раз большое Спасибо! вот так отлично работает код

Файлы:
sl_tp_0.mq5 4 kb
Vladimir Karputov
Модератор
163883
Vladimir Karputov  
Aleksandr Klapatyuk:

Vladimir Karputov

ещё раз большое Спасибо! вот так отлично работает код

Стоп лосс и Тейк профит не очень маленькие? Может часто цеплять Стоп лосс ...

Alexsandr San
1990
Alexsandr San  
Vladimir Karputov:

Стоп лосс и Тейк профит не очень маленькие? Может часто цеплять Стоп лосс ...

это - просто с бухты Барахты.

цифры для теста  

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий