초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 1326

 
Aleksandr Egorov :
각 쌍에 대해 MT5에서 미결 주문에 대한 수수료를 별도로 계산하는 방법은 무엇입니까? 누구든지 해결책이 있습니까

어떤 이유로 원하지 않습니다 - 0이 표시됩니다

 //+------------------------------------------------------------------+
//|                                                   Commission.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link        " https://www.mql5.com "
#property version    "1.00"
#include <Trade\PositionInfo.mqh>
CPositionInfo     m_position;             // : trade position object
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   double Commission= 0.00 ;
   int total= PositionsTotal ();
   for ( int i=total- 1 ; i>= 0 ; i--)
     {
       string    position_GetSymbol= PositionGetSymbol (i); //
       if (position_GetSymbol== Symbol ())
        {
         Commission=Commission+m_position.Commission();
        }
     }
   string msg= DoubleToString (Commission, 2 );
   Print (msg);
  }
//+------------------------------------------------------------------+
 
SanAlex :

어떤 이유로 원하지 않습니다 - 0이 표시됩니다

내가 기억하는 한, 이것은 한 번도 작동하지 않았으며 포지션에 대한 커미션을 받을 수 없습니다. 히스토리에서 모든 거래를 살펴보고 선택한 포지션 에 속하는지 확인하고 요약해야 합니다. 꽤 까다롭지만 어딘가에 코드 예제가 있었는데 fxsaber에서 온 것 같습니다.

 
transcendreamer :

내가 기억하는 한, 이것은 한 번도 작동하지 않았으며 포지션에 대한 커미션을 받을 수 없습니다. 히스토리에서 모든 거래를 살펴보고 선택한 포지션 에 속하는지 확인하고 요약해야 합니다. 꽤 까다롭지만 어딘가에 코드 예제가 있었는데 fxsaber에서 온 것 같습니다.

fxsaber 는 잘 버텼고 모든 열린 쌍에 대한 계산이있었습니다. 토비시 총 수수료

 
Aleksandr Egorov :

fxsaber 는 잘 버텼고 모든 열린 쌍에 대한 계산이있었습니다. 토비시 총 수수료

정확히는 여기 링크가 있습니다: https://www.mql5.com/en/forum/93879/page5

Трудности перевода :)
Трудности перевода :)
  • 2016.09.05
  • www.mql5.com
Хочу рассказать, как я перевел свой проект с MQL4 на 5-ку за одну ночь...
 
글쎄, 여기에 질문 자체가 있습니다)) 회전율이 아닌 단순한 것을 단순하게 만드는 것이 실제로 불가능하지 않습니까? 커미션 PPC를 계산해야 팽창합니다
 
Aleksandr Egorov :
글쎄, 여기에 질문 자체가 있습니다)) 회전율이 아닌 단순한 것을 단순하게 만드는 것이 실제로 불가능하지 않습니까? 팽창하려면 PPC 수수료를 계산해야합니다

글쎄, 네, 왜 개발자들이 기성품 기능을 만들지 않는지 불명확합니다... 언젠가 그들이 그것을 작성할 것입니다... i-function이 없었고 모두가 너무 어리둥절하기 전에 ... 이제 . .. 아마도 우리는 커미션을 기다릴 것입니다 ...

 
transcendreamer :

글쎄, 네, 왜 개발자들이 기성품 기능을 만들지 않는지 불명확합니다... 언젠가 그들이 그것을 작성할 것입니다... i-function이 없었고 모두가 너무 어리둥절하기 전에 ... 이제 . .. 아마도 우리는 커미션을 기다릴 것입니다 ...

네, 직접 하는 것이 더 빠를 것입니다.

 
SanAlex :

어떤 이유로 원하지 않습니다 - 0이 표시됩니다

여전히 0이고 커미션을 표시하고 싶지 않습니다.

 //+------------------------------------------------------------------+
//|                                                   Commission.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link        " https://www.mql5.com "
#property version    "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   double Commission=:: PositionGetDouble ( POSITION_COMMISSION );
// На случай, если POSITION_COMMISSION не работает
   if (Commission== 0 )
     {
       const ulong Ticket=GetPositionDealIn();
       if (Ticket> 0 )
        {
         const double LotsIn=:: HistoryDealGetDouble (Ticket, DEAL_VOLUME );
         if (LotsIn> 0 )
            Commission=:: HistoryDealGetDouble (Ticket, DEAL_COMMISSION )*:: PositionGetDouble ( POSITION_VOLUME )/LotsIn;
        }
     }
//---
   string msg_1= DoubleToString (Commission, 2 );
   string msg= DoubleToString (GetPositionCommission(), 2 );
   Print (msg_1, "     " ,msg);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetPositionCommission( void )
  {
   double Commission=:: PositionGetDouble ( POSITION_COMMISSION );
// На случай, если POSITION_COMMISSION не работает
   if (Commission== 0 )
     {
       const ulong Ticket=GetPositionDealIn();
       if (Ticket> 0 )
        {
         const double LotsIn=:: HistoryDealGetDouble (Ticket, DEAL_VOLUME );
         if (LotsIn> 0 )
            Commission=:: HistoryDealGetDouble (Ticket, DEAL_COMMISSION )*:: PositionGetDouble ( POSITION_VOLUME )/LotsIn;
        }
     }
   return (Commission);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
ulong GetPositionDealIn( const ulong HistoryTicket= 0 )
  {
   ulong Ticket= 0 ;
   if ((HistoryTicket== 0 ) ? :: HistorySelectByPosition (:: PositionGetInteger ( POSITION_TICKET )) : :: HistorySelectByPosition (HistoryTicket))
     {
       const int Total=:: HistoryDealsTotal ();
       for ( int i= 0 ; i<Total; i++)
        {
         const ulong TicketDeal=:: HistoryDealGetTicket (i);
         if (TicketDeal> 0 )
             if (( ENUM_DEAL_ENTRY ):: HistoryDealGetInteger (TicketDeal, DEAL_ENTRY )== DEAL_ENTRY_IN )
              {
               Ticket=TicketDeal;
               break ;
              }
        }
     }
   return (Ticket);
  }
//+------------------------------------------------------------------+
 
바가 EMA 라인 아래 또는 위에서 닫힐 때 포지션을 여는 또 다른 질문이 있습니다.
iClose를 삽입했지만 오류가 있습니다. 각 막대 뒤에 새 위치가 열립니다.


나는 이것을 가지고있다



   bool Buy_Condition = (close1 > EMA0[ 0 ]);

     {  
       if (Buy_Condition) //Buy
            {
       if (!RefreshRates())
         return ;
      TimeBar=time_0;
      my_TP = m_symbol.Ask() + ExtTakeProfit* Point ();
      my_SL = m_symbol.Ask() - ExtStopLoss* Point ();
      my_lot = Lots;
      OPENORDER( "Sell" );
            }
      }

   bool Sell_Condition = (close1 < EMA0[ 0 ]);

    {
     if (Sell_Condition )
         {
       if (!RefreshRates())
         return ;
      TimeBar=time_0;
      my_TP  = m_symbol.Bid() - ExtTakeProfit* Point ();
      my_SL  = m_symbol.Bid() + ExtStopLoss* Point ();

      my_lot= Lots;
      OPENORDER( "Buy" );
         }
     }
 } 
   if (colorBuffer[m_bar_current+ 1 ]>colorBuffer[m_bar_current] ) //Buy
     {
       if (!RefreshRates())
         return ;
      TimeBar=time_0;
      CLOSEORDER( "Sell" );
     }
 
   if (colorBuffer[m_bar_current+ 1 ]<colorBuffer[m_bar_current] ) //Sell
     {
       if (!RefreshRates())
         return ;
      TimeBar=time_0;
      CLOSEORDER( "Buy" );
     }
 
   return ;
  }
  
//--------------------------------------------------------------------
void CLOSEORDER( string ord)
  {
   for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--)   // returns the number of open positions
       if (m_position.SelectByIndex(i))
         if (m_position. Symbol ()== Symbol () && m_position.Magic()==m_magic)
           {
             if (m_position.PositionType()== POSITION_TYPE_BUY && ord== "Buy" )
               m_trade.PositionClose(m_position.Ticket());   // Close Buy
             if (m_position.PositionType()== POSITION_TYPE_SELL && ord== "Sell" )
               m_trade.PositionClose(m_position.Ticket()); // Close Sell
           }
  }
//--------------------------------------------------------------------

void OPENORDER( string ord)
  {
   if (ord== "Sell" )
   if (all_positions== 1 )
  
       for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--) // returns the number of open positions
         if (m_position.SelectByIndex(i))
           if (m_position.PositionType()== POSITION_TYPE_SELL )
             //if(m_position.PositionType()==POSITION_TYPE_SELL)
               return ;                           // Если buy, то не открываемся
 
       if (!m_trade.Sell(my_lot, Symbol (),m_symbol.Bid(),my_SL,my_TP, "" ))
         Print ( "Buy -> false. Result Retcode: " ,m_trade.ResultRetcode(),
               ", description of result: " ,m_trade.ResultRetcodeDescription(),
               ", ticket of deal: " ,m_trade.ResultDeal());
   if (ord== "Buy" )
   if (all_positions== 1 )
 
       for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--) // returns the number of open positions
         if (m_position.SelectByIndex(i))
             //if(m_position.PositionType()==POSITION_TYPE_BUY)
             if (m_position.PositionType()== POSITION_TYPE_BUY )
               return ;                           // Если buy, то не открываемся
 

       if (!m_trade.Buy(my_lot, Symbol (),m_symbol.Ask(),my_SL,my_TP, "" ))
         Print ( "BUY_STOP -> false. Result Retcode: " ,m_trade.ResultRetcode(),
               ", description of Retcode: " ,m_trade.ResultRetcodeDescription(),
               ", ticket of order: " ,m_trade.ResultOrder());
   return ;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
 
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if (!m_symbol.RefreshRates())
       return ( false );
//--- protection against the return value of "zero"
   if (m_symbol.Ask()== 0 || m_symbol.Bid()== 0 )
       return ( false );
//---
   return ( true );
  }
//+------------------------------------------------------------------+
//| Get Time for specified bar index                                 |
//+------------------------------------------------------------------+
datetime iTime ( const int index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
  {
   if (symbol== NULL )
      symbol= Symbol ();
   if (timeframe== 0 )
      timeframe= Period ();
   datetime Time[];
   datetime time= 0 ;
   ArraySetAsSeries (Time, true );
   int copied= CopyTime (symbol,timeframe,index, 1 ,Time);
   if (copied> 0 )
      time=Time[ 0 ];
   return (time);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
bool iGetArray( const int handle, const int buffer, const int start_pos,
               const int count, double &arr_buffer[])
  {
   bool result= true ;
   if (! ArrayIsDynamic (arr_buffer))
     {
       PrintFormat ( "ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!" , __FILE__ , __FUNCTION__ );
       return ( false );
     }
   ArrayFree (arr_buffer);
//--- reset error code
   ResetLastError ();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied= CopyBuffer (handle,buffer,start_pos,count,arr_buffer);
   if (copied!=count)
     {
       //--- if the copying fails, tell the error code
       PrintFormat ( "ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d" ,
                   __FILE__ , __FUNCTION__ ,count,copied, GetLastError ());
       //--- quit with zero result - it means that the indicator is considered as not calculated
       return ( false );
     }
   return (result);
 
 
}


미결제 주문이 있는지 확인이 충분하지 않다는 뜻인가요?




파일:
Unbenannt5.PNG  28 kb
 
Eugen8519 :
바가 EMA 라인 아래 또는 위에서 닫힐 때 포지션을 여는 또 다른 질문이 있습니다.
iClose를 삽입했지만 오류가 있습니다. 각 막대 뒤에 새 위치가 열립니다.

지표에서 신호를 생성한 다음 Expert Advisor에 입력하는 것이 가장 좋습니다.

FX10

 //+------------------------------------------------------------------+
//|                                                         Fx10.mq5 |
//|                                   Copyright © 2000-2007, palanka |
//|                                         http://www.metaquotes.ru |
//+------------------------------------------------------------------+
//---- авторство индикатора
#property copyright "Copyright © 2000-2007, palanka"
//---- ссылка на сайт автора
#property link        ""
//---- номер версии индикатора
#property version    "1.02"
//---- отрисовка индикатора в главном окне
#property indicator_chart_window
//---- для расчета и отрисовки индикатора использовано два буфера
#property indicator_buffers 2
//---- использовано всего два графических построения
#property indicator_plots    2
//+----------------------------------------------+
//|  Объявление констант                         |
//+----------------------------------------------+
#define RESET   0 // константа для возврата терминалу команды на пересчет индикатора
//+----------------------------------------------+
//|  Параметры отрисовки медвежьего индикатора   |
//+----------------------------------------------+
//---- отрисовка индикатора 1 в виде символа
#property indicator_type1    DRAW_ARROW
//---- в качестве цвета индикатора использован цвет Magenta
#property indicator_color1   Magenta
//---- толщина линии индикатора 1 равна 4
#property indicator_width1    4
//---- отображение метки индикатора
#property indicator_label1    "Fx10 Sell"
//+----------------------------------------------+
//|  Параметры отрисовки бычьего индикатора      |
//+----------------------------------------------+
//---- отрисовка индикатора 2 в виде символа
#property indicator_type2    DRAW_ARROW
//---- в качестве цвета индикатора использован цвет Lime
#property indicator_color2   Lime
//---- толщина линии индикатора 2 равна 4
#property indicator_width2    4
//---- отображение метки индикатора
#property indicator_label2 "Fx10 Buy"
//+----------------------------------------------+
//| Входные параметры индикатора                 |
//+----------------------------------------------+
input double ParmMult= 1.0 ; // multiply the standard parameters by this scale factor
//+----------------------------------------------+
//---- объявление динамических массивов, которые в дальнейшем
//---- будут использованы в качестве индикаторных буферов
double SellBuffer[];
double BuyBuffer[];
//---- объявление целочисленных переменных начала отсчета данных
int min_rates_total;
//---- объявление целочисленных переменных для хендлов индикаторов
int MA5_Handle,MA10_Handle,RSI_Handle,STO_Handle,MACD_Handle,ATR_Handle;
int OldTrend;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit ()
  {
//---- инициализация глобальных переменных
   min_rates_total= int (ParmMult* 26 + 1 );
//---- получение хендла индикатора MA5
   MA5_Handle= iMA ( NULL , 0 , int (ParmMult* 5 ), 0 , MODE_LWMA , PRICE_CLOSE );
   if (MA5_Handle== INVALID_HANDLE )
       Print ( " Не удалось получить хендл индикатора iMA5" );
//---- получение хендла индикатора MA10
   MA10_Handle= iMA ( NULL , 0 , int (ParmMult* 10 ), 0 , MODE_SMA , PRICE_CLOSE );
   if (MA10_Handle== INVALID_HANDLE )
       Print ( " Не удалось получить хендл индикатора iMA10" );
//---- получение хендла индикатора RSI
   RSI_Handle= iRSI ( NULL , 0 , int (ParmMult* 14 ), PRICE_CLOSE );
   if (RSI_Handle== INVALID_HANDLE )
       Print ( " Не удалось получить хендл индикатора iRSI" );
//---- получение хендла индикатора Stochastic
   STO_Handle= iStochastic ( NULL , 0 , int ( 5 *ParmMult), int ( 3 *ParmMult), int ( 3 *ParmMult), MODE_SMA , STO_LOWHIGH );
   if (STO_Handle== INVALID_HANDLE )
       Print ( " Не удалось получить хендл индикатора iStochastic" );
//---- получение хендла индикатора MACD
   MACD_Handle= iMACD ( NULL , 0 , int ( 12 *ParmMult), int ( 26 *ParmMult), int ( 9 *ParmMult), PRICE_CLOSE );
   if (MACD_Handle== INVALID_HANDLE )
       Print ( " Не удалось получить хендл индикатора iMACD" );
//---- получение хендла индикатора ATR
   ATR_Handle= iATR ( NULL , 0 , 15 );
   if (ATR_Handle== INVALID_HANDLE )
       Print ( " Не удалось получить хендл индикатора ATR" );
//---- превращение динамического массива SellBuffer[] в индикаторный буфер
   SetIndexBuffer ( 0 ,SellBuffer, INDICATOR_DATA );
//---- осуществление сдвига начала отсчета отрисовки индикатора 1
   PlotIndexSetInteger ( 0 , PLOT_DRAW_BEGIN ,min_rates_total);
//---- символ для индикатора
   PlotIndexSetInteger ( 0 , PLOT_ARROW , 119 );
//---- установка значений индикатора, которые не будут видимы на графике
   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0 );
//---- индексация элементов в буфере, как в таймсерии
   ArraySetAsSeries (SellBuffer, true );
//---- превращение динамического массива BuyBuffer[] в индикаторный буфер
   SetIndexBuffer ( 1 ,BuyBuffer, INDICATOR_DATA );
//---- осуществление сдвига начала отсчета отрисовки индикатора 2
   PlotIndexSetInteger ( 1 , PLOT_DRAW_BEGIN ,min_rates_total);
//---- символ для индикатора
   PlotIndexSetInteger ( 1 , PLOT_ARROW , 119 );
//---- установка значений индикатора, которые не будут видимы на графике
   PlotIndexSetDouble ( 1 , PLOT_EMPTY_VALUE , 0 );
//---- индексация элементов в буфере, как в таймсерии
   ArraySetAsSeries (BuyBuffer, true );
//---- установка формата точности отображения индикатора
   IndicatorSetInteger ( INDICATOR_DIGITS , _Digits );
//---- имя для окон данных и метка для подокон
   string short_name= "Fx10" ;
   IndicatorSetString ( INDICATOR_SHORTNAME ,short_name);
//----
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---- проверка количества баров на достаточность для расчета
   if ( BarsCalculated (MA5_Handle)<rates_total
      || BarsCalculated (MA10_Handle)<rates_total
      || BarsCalculated (RSI_Handle)<rates_total
      || BarsCalculated (STO_Handle)<rates_total
      || BarsCalculated (MACD_Handle)<rates_total
      || BarsCalculated (ATR_Handle)<rates_total
      || rates_total<min_rates_total)
       return (RESET);
//---- объявления локальных переменных
   int to_copy,limit,bar;
   double MA5[],MA10[],RSI[],STO[],MACD[],STOS[],MACDS[],ATR[];
   bool RsiUp,RsiDn,StochUp,StochDn,MacdUp,MacdDn;
//---- расчеты необходимого количества копируемых данных и
//---- и стартового номера limit для цикла пересчета баров
   if (prev_calculated>rates_total || prev_calculated<= 0 ) // проверка на первый старт расчета индикатора
      limit=rates_total-min_rates_total;   // стартовый номер для расчета всех баров
   else
      limit=rates_total-prev_calculated; // стартовый номер для расчета новых баров
   to_copy=limit+ 1 ;
//---- копируем вновь появившиеся данные в массивы
   if ( CopyBuffer (MA5_Handle, 0 , 0 ,to_copy,MA5)<= 0 )
       return (RESET);
   if ( CopyBuffer (MA10_Handle, 0 , 0 ,to_copy,MA10)<= 0 )
       return (RESET);
   if ( CopyBuffer (RSI_Handle, 0 , 0 ,to_copy,RSI)<= 0 )
       return (RESET);
   if ( CopyBuffer (STO_Handle, 0 , 0 ,to_copy,STO)<= 0 )
       return (RESET);
   if ( CopyBuffer (STO_Handle, 1 , 0 ,to_copy,STOS)<= 0 )
       return (RESET);
   if ( CopyBuffer (MACD_Handle, 0 , 0 ,to_copy,MACD)<= 0 )
       return (RESET);
   if ( CopyBuffer (MACD_Handle, 1 , 0 ,to_copy,MACDS)<= 0 )
       return (RESET);
   if ( CopyBuffer (ATR_Handle, 0 , 0 ,to_copy,ATR)<= 0 )
       return (RESET);
//---- индексация элементов в массивах, как в таймсериях
   ArraySetAsSeries (MA5, true );
   ArraySetAsSeries (MA10, true );
   ArraySetAsSeries (RSI, true );
   ArraySetAsSeries (STO, true );
   ArraySetAsSeries (STOS, true );
   ArraySetAsSeries (MACD, true );
   ArraySetAsSeries (MACDS, true );
   ArraySetAsSeries (ATR, true );
   ArraySetAsSeries (high, true );
   ArraySetAsSeries (low, true );
//---- основной цикл расчета индикатора
   for (bar=limit; bar>= 0 && ! IsStopped (); bar--)
     {
      BuyBuffer[bar]= 0.0 ;
      SellBuffer[bar]= 0.0 ;
       if (MA5[bar]>MA10[bar])
        {
         RsiUp=RSI[bar]>= 55.0 ;
         StochUp=STO[bar]>STOS[bar];
         MacdUp=MACD[bar]>MACDS[bar];
         if (StochUp && RsiUp && MacdUp)
           {
             if (OldTrend< 0 )
               BuyBuffer[bar]=low[bar]-ATR[bar]* 3 / 8 ;
             if (bar!= 0 )
               OldTrend=+ 1 ;
           }
        }
       if (MA5[bar]<MA10[bar])
        {
         RsiDn=RSI[bar]<= 45.0 ;
         StochDn=STO[bar]<STOS[bar];
         MacdDn=MACD[bar]<MACDS[bar];
         if (StochDn && RsiDn && MacdDn)
           {
             if (OldTrend> 0 )
               SellBuffer[bar]=high[bar]+ATR[bar]* 3 / 8 ;
             if (bar!= 0 )
               OldTrend=- 1 ;
           }
        }
     }
//----
   return (rates_total);
  }
//+------------------------------------------------------------------+
FX10 3
파일:
Exp_Fx10.mq5  16 kb
사유: