Подправить код новичку - страница 3

 
Vladimir Karputov:

Код работать не будет. Выше правильно советовали:

Вроде навскидку ошибок не вижу.

Надо бы, конечно, пройтись в отладчике...

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

 
Georgiy Merts:

Вроде навскидку ошибок не вижу.

Надо бы, конечно, пройтись в отладчике...

Символ не инициализирован.

 

Вот код, который может закрывать все позиции по ТЕКУЩЕМУ символу. Если поставить уникальный идентификатор в "0" - будут закрывать все позиции на ТЕКУЩЕМ символе, без учета magic.

Может закрывать или при превышении баланса или при превышении средств.

//+------------------------------------------------------------------+
//|                                         Close Balance Equity.mq5 |
//|                              Copyright © 2018, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
//---
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
#include <Trade\AccountInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Expert\Money\MoneyFixedMargin.mqh>
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                      // trading object
CSymbolInfo    m_symbol;                     // symbol info object
CAccountInfo   m_account;                    // account info wrapper
CDealInfo      m_deal;                       // deals object
COrderInfo     m_order;                      // pending orders object
CMoneyFixedMargin *m_money;
//--- input parameters
input double InpStepBalance   = 0;           // Step Balance ("0" -> off parametr)
input double InpStepEquity    = 100;         // Step equity  ("0" -> off parametr)
input ulong  m_magic          = 0;           // magic number ("0" -> all magic's)
//---
ulong  m_slippage=10;                        // slippage
double m_start_balance  = 0.0;
double m_start_equity   = 0.0;
bool   m_need_close_all = false;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(!m_symbol.Name(Symbol())) // sets symbol name
      return(INIT_FAILED);
//---
   m_trade.SetExpertMagicNumber(m_magic);
   m_trade.SetMarginMode();
   m_trade.SetDeviationInPoints(m_slippage);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(m_need_close_all)
     {
      if(IsPositionExists())
        {
         CloseAllPositions();
         return;
        }
      else
         m_need_close_all=false;
     }
//---
   if(!IsPositionExists())
     {
      if(InpStepBalance>0.0)
         m_start_balance=m_account.Balance();
      if(InpStepEquity>0.0)
         m_start_equity=m_account.Equity();
     }
   else
     {
      if(InpStepBalance>0.0 && m_account.Balance()-m_start_balance>InpStepBalance)
        {
         m_need_close_all=true;
         return;
        }
      if(InpStepEquity>0.0 && m_account.Equity()-m_start_equity>InpStepEquity)
        {
         m_need_close_all=true;
         return;
        }
     }
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//---

  }
//+------------------------------------------------------------------+
//| Is position exists                                               |
//+------------------------------------------------------------------+
bool IsPositionExists(void)
  {
   for(int i=PositionsTotal()-1;i>=0;i--)
      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()==m_magic || m_magic==0))
            return(true);
//---
   return(false);
  }
//+------------------------------------------------------------------+
//| Close all positions                                              |
//+------------------------------------------------------------------+
void CloseAllPositions()
  {
   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()==m_magic || m_magic==0))
            m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
  }
//+------------------------------------------------------------------+

В общем протестируйте. Будут вопросы - спрашивайте. Ночью залью этот код в КодоБазу.

Файлы:
 
Georgiy Merts:

Вроде навскидку ошибок не вижу.

Надо бы, конечно, пройтись в отладчике...

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

Автор еще хочет внедрить код в советник, но знания ему это не позволяют

 
Vladimir Karputov:

Символ не инициализирован.

Точно.  К сожалению, давно не работал со Стандартной Библиотекой.

Но, при проходе в отладчике - сразу бы выяснилось, что имя возвращается не то.

 
Sprut112:

Автор еще хочет внедрить код в советник, но знания ему это не позволяют

Вперед !

Терпенье и труд все перетрут. Ты на верном пути.

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

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