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

[삭제]  
Alexey Viktorov :

어제 나는이 기적을보기 위해 다운로드했습니다 ... 그리고 갑자기 그들은 나에게 tyrnet을 박탈했습니다. 뇌우 후 하루가 끝날 때까지 기술 작업. 그래서 나는 게으름에서 이 기적을 여기 에 게시된 MQL5로 다시 작성하기로 결정했습니다.

좋은 것이 없으면 나쁜 것도 없다는 것이 밝혀졌습니다. . . . . . . .

나는 당신의 Expert Advisor에 지표를 추가했습니다 - 당신이 상관하지 않을 것이라고 생각합니다!? 내가 원하는대로 된 것 같다 Sprut 185

(노란색은 여기 기존 전문가에 추가된 내용 . )

 //+------------------------------------------------------------------+
//|                                                 2 DVA_Martin.mq5 |
//|                                          © 2021, Alexey Viktorov |
//|                     https://www.mql5.com/ru/users/alexeyvik/news |
//+------------------------------------------------------------------+
#property copyright "© 2021, Alexey Viktorov"
#property link        " https://www.mql5.com/ru/users/alexeyvik/news "
#property version    "2.00"
//---
#include <Trade\Trade.mqh>
CTrade trade;
//---
input int      TakeProfit1         = 300 ;   // профит первой позиции
input int      TakeProfit2         = 250 ;   // профит второй позиции
input int      TakeProfit3         = 200 ;   // профит третьей позиции
input int      TakeProfit4         = 100 ;   // профит четвертой и следующих позиций
input int      Step                = 200 ;   // шаг первой позиции
input int      Delta               = 100 ;   // добавка к шагу
// со второй позиции увеличивает расстояние последующих позиций на величину "дельта" от предыдущего
input double   Lot                 = 0.03 ; // первый лот открытия
input double   MaximalLot          = 0.5 ;   // максимальный лот, который мы разрешаем
input int      MaxTrades           = 9 ;     // максимальное количество позиций одного направления
input double   MultiplicatorLot    = 1.6 ;   // умножаем последующие позиции
input int      Magic               = 123 ;   // идентификатор советника
//--- Пременные для хранения собранной информации
double MaxLot  = 0 ;
double LotBuy  = 0 ;
double LotSell = 0 ;
//---
int m_bar_current= 0 ;
int StepMA_NRTR_Handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   trade.SetExpertMagicNumber(Magic);
   MaxLot = contractSize(MaximalLot);
//--- create StepMA_NRTR indicator
   StepMA_NRTR_Handle= iCustom ( NULL , 0 , "StepMA_NRTR" );
   if (StepMA_NRTR_Handle== INVALID_HANDLE )
     {
       printf ( "Error creating StepMA_NRTR indicator" );
       return ( false );
     }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   Comment ( "" );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   double StepMA_NRTR[],StepMA_NRTRS[];
   ArraySetAsSeries (StepMA_NRTR, true );
   ArraySetAsSeries (StepMA_NRTRS, true );
   int start_pos= 1 ,count= 3 ;
   if (!iGetArray(StepMA_NRTR_Handle, 0 ,start_pos,count,StepMA_NRTR)||
      !iGetArray(StepMA_NRTR_Handle, 1 ,start_pos,count,StepMA_NRTRS))
     {
       return ;
     }
//---
   int posTotal = PositionsTotal ();
   double BuyMinPrice = DBL_MAX , //  Минимальная цена Buy позиции
          SelMaxPrice = DBL_MIN , //  Максимальная цена Sell позиции
          BuyMinLot = 0 ,         //  Лот самой нижней Buy позиции
          SelMaxLot = 0 ,         //  Лое самой верхней Sell позиции
          posPrice = 0.0 ,
          posLot = 0.0 ,
          BuyAwerage = 0 ,
          SelAwerage = 0 ,
          BuyPrice = 0 ,
          SelPrice = 0 ,
          BuyLot = 0 ,
          SelLot = 0 ;
   MqlTick tick;
   if (! SymbolInfoTick ( _Symbol , tick))
       return ;
   int b = 0 ,
       s = 0 ;
   for ( int i = 0 ; i < posTotal; i++)
     {
       ulong posTicket = PositionGetTicket (i);
       if ( PositionGetString ( POSITION_SYMBOL ) == _Symbol && PositionGetInteger ( POSITION_MAGIC ) == Magic)
        {
         posPrice = PositionGetDouble ( POSITION_PRICE_OPEN );
         posLot = PositionGetDouble ( POSITION_VOLUME );
         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
           {
            b++; // Считаем открытые позиции на покупку
             if (posPrice < BuyMinPrice)
              {
               BuyMinPrice = posPrice;
               BuyMinLot = posLot;
               BuyPrice += posPrice*posLot;   // добавить к переменной BuyPrice Цена оредра 1 * лот ордера 1
               BuyLot += posLot;             // суммируем лоты
              }
           }
         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
           {
            s++; // Считаем открытые позиции на продажу
             if (posPrice > SelMaxPrice)
              {
               SelMaxPrice = posPrice;
               SelMaxLot = posLot;
               SelPrice += posPrice*posLot;   // добавить к переменной BuyPrice Цена оредра 1 * лот ордера 1
               SelLot += posLot;             // суммируем лоты
              }
           }
        }
     }
   LotBuy = b == 0 ? contractSize(Lot) : fmin (MaxLot, contractSize(BuyMinLot*MultiplicatorLot));
   LotSell = s == 0 ? contractSize(Lot) : fmin (MaxLot, contractSize(SelMaxLot*MultiplicatorLot));
//---
//--- BUY Signal
   if (StepMA_NRTR[m_bar_current]<StepMA_NRTRS[m_bar_current])
     {
       if (b == 0 || (b < MaxTrades && BuyMinPrice-tick.ask >= (Step+Delta*b)* _Point ))
         openPos( ORDER_TYPE_BUY , LotBuy, tick.ask);
     }
//--- SELL Signal
   if (StepMA_NRTR[m_bar_current]>StepMA_NRTRS[m_bar_current])
     {
       if (s == 0 || (s < MaxTrades && tick.bid-SelMaxPrice >= (Step+Delta*s)* _Point ))
         openPos( ORDER_TYPE_SELL , LotSell, tick.bid);
     }
//--- посчитаем математические формулы средних цен
   switch (b)
     {
       case 0 :
         return ;
       case 1 :
         BuyAwerage = BuyPrice/BuyLot+TakeProfit1* _Point ;
         break ;
       case 2 :
         BuyAwerage = BuyPrice/BuyLot+TakeProfit1* _Point ;
         break ;
       case 3 :
         BuyAwerage = BuyPrice/BuyLot+TakeProfit3* _Point ;
         break ;
       default :
         BuyAwerage = BuyPrice/BuyLot+TakeProfit4* _Point ;
         break ;
     }
   switch (s)
     {
       case 0 :
         return ;
       case 1 :
         SelAwerage = SelPrice/SelLot-TakeProfit1* _Point ;
         break ;
       case 2 :
         SelAwerage = SelPrice/SelLot-TakeProfit2* _Point ;
         break ;
       case 3 :
         SelAwerage = SelPrice/SelLot-TakeProfit3* _Point ;
         break ;
       default :
         SelAwerage = SelPrice/SelLot-TakeProfit4* _Point ;
         break ;
     }
   normalizePrice(BuyAwerage); // Произведем расчет цены TP Buy
   normalizePrice(SelAwerage); // Произведем расчет цены TP Sell
//---
   for ( int i = 0 ; i < posTotal; i++)
     {
       ulong posTicket = PositionGetTicket (i);
       if ( PositionGetString ( POSITION_SYMBOL ) == _Symbol && PositionGetInteger ( POSITION_MAGIC ) == Magic)
        {
         double posTP = PositionGetDouble ( POSITION_TP );
         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
           {
             if ( fabs (posTP-BuyAwerage) > _Point && tick.ask < BuyAwerage) // Если тейк не равен требуемой цене
               if (!trade.PositionModify(posTicket, 0.0 , BuyAwerage))
                   Print ( "Ошибка " , __LINE__ );
           }
         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
           {
             if ( fabs (posTP-SelAwerage) > _Point && tick.bid > SelAwerage) // Если тейк не равен требуемой цене
               if (!trade.PositionModify(posTicket, 0.0 , SelAwerage))
                   Print ( "Ошибка " , __LINE__ );
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void openPos( ENUM_ORDER_TYPE type, double lot, double price)
  {
   trade.CheckVolume( _Symbol , lot, price, type);
   if (trade.CheckResultMarginFree() <= 0.0 )
     {
       Print ( "Not enough money for " , EnumToString (type), " " , lot, " " , _Symbol , " Error code=" , trade.CheckResultRetcode());
       return ;
     }
   if (!trade.PositionOpen( _Symbol , type, LotBuy, price, 0.0 , 0.0 ))
       Print (trade.ResultRetcode());
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double contractSize( double volume, string symbol = NULL )
  {
   symbol = symbol == NULL ? _Symbol : symbol;
   double v = volume;
   double volumeStep = SymbolInfoDouble (symbol, SYMBOL_VOLUME_STEP );
   v = round (volume/volumeStep)*volumeStep;
   double minLot = SymbolInfoDouble (symbol, SYMBOL_VOLUME_MIN );
   return ((v < minLot ? minLot : v));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double normalizePrice( double &price, string symbol = NULL )
  {
   symbol = symbol == NULL ? _Symbol : symbol;
   double tickSize = SymbolInfoDouble (symbol, SYMBOL_TRADE_TICK_SIZE );
   price = round (price/tickSize)*tickSize;
   return (tickSize);
  }
//+------------------------------------------------------------------+
//| Filling the indicator buffers from the indicator                 |
//+------------------------------------------------------------------+
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))
     {
       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)
     {
       return ( false );
     }
   return (result);
  }
//+------------------------------------------------------------------+

Советники: DVA_Martin
Советники: DVA_Martin
  • 2021.06.30
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Советники: DVA_Martin
 
SanAlex :

나는 당신의 Expert Advisor에 지표를 추가했습니다 - 당신이 상관하지 않을 것이라고 생각합니다!? 내가 원하는대로 된 것 같다 Sprut 185

(노란색은 여기 기존 전문가에 추가된 내용 . )

그리고 3개의 막대에서 지표 값이 나오는 이유는 무엇입니까? 배열을 시계열로 뒤집는 이유는 무엇입니까?

일반적으로 그것은 나에게 아닌 것 같습니다 ... 마틴이 작동하지 않을 것입니다.

[삭제]  
Alexey Viktorov :

그리고 3개의 막대에서 지표 값이 나오는 이유는 무엇입니까? 배열을 시계열로 뒤집는 이유는 무엇입니까?

일반적으로 그것은 나에게 아닌 것 같습니다 ... 마틴이 작동하지 않을 것입니다.

여기의 표시기는 방향 필터와 같으며 Expert Advisor가 전체 작업을 수행합니다.

\\\\\\\\\\\\

표시기 자체는 포지션을 열지 않습니다.

 
SanAlex :

여기의 표시기는 방향 필터와 같으며 Expert Advisor가 전체 작업을 수행합니다.

작업은 작성된 코드에 의해 수행되어야 합니다. 그러나 마틴이 절대 켜지지 않는 조건을 설정했습니다. 라고 생각하지만 확인할 마음도 시간도 없다.

[삭제]  
Alexey Viktorov :

작업은 작성된 코드로 수행되어야 합니다. 그러나 마틴이 절대로 켜지지 않는 조건을 설정했습니다. 라고 생각하지만 확인할 마음도 시간도 없다.

여기에서 나는 그의 작업을 확인합니다. 모든 것이 계획대로 작동합니다.

2 DVA_마틴

 
Alexey Viktorov :

Martin은 표시기 신호가 반대일 때만 켜야 합니까 아니면 이것에 관계 없이 켜야 합니까?

예: 지표에 따라 매수 포지션이 열립니다. 가격은 주어진 거리만큼 떨어졌고 표시기는 이미 매도를 표시하고 있습니다. 매수 포지션을 열어야 합니까?

약속대로 포토샵을 좀 했습니다.

하나

어쨌든 명확하지 않으면 개인적인 의사 소통을 통해서만 내 아이디어의 의미를 설명 할 수 있습니다.

[삭제]  
SanAlex :

나는 여기서 100,000 루블로 이해하지 못하는 무언가를했습니다. 최대 200만

표시기를 변경하고 5분 동안. 15일 만에 100만 유로.

LeMan_BrainTrend1Sig 2

LeMan_BrainTrend1Sig

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

전문가에 추가됨 - 총 이익(모든 쌍에서)에 대해 이익을 닫고 전문가를 제거합니다.

 input group   "---- : Parameters:  ----"
input int     TargetProfit     = 1000000 ; // : Balance + Profit(add to balance)
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ( void )
  {
//---
   if ( AccountInfoDouble ( ACCOUNT_EQUITY )>=TargetProfit)
     {
      AllClose();
       ExpertRemove ();
     }
//---

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

이 2개의 표시기가 있어야 합니다( 표시기의 이름이 변경되지 않도록 하십시오)

 
SanAlex :

표시기를 변경하고 5분 동안. 15일 만에 100만 유로.

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

전문가에 추가됨 - 총 이익(모든 쌍에서)에 대해 이익을 닫고 전문가를 제거합니다.

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

이 2개의 표시기가 있어야 합니다( 표시기의 이름이 변경되지 않도록 하십시오)

설정에서 손절매 누락

 

\n"과 같은 방법을 사용하여 문자열을 줄로 나누는 방법이 있습니다.

그러나 이미 줄로 분할된 문자열 변수를 한 줄로 붙이거나 변환하는 방법이 있습니까?

즉, 매개변수 값 등의 모든 텍스트가 이 줄에서 사용 가능한(문자열) 변수는 한 줄로 작성되었습니다.

문제는 csv에 쓸 때 발생했습니다(문자열 변수의 값은 여러 줄에 기록됨).

[삭제]  
Vitaly Muzichenko :

설정에서 손절매 누락

손절매를 사용하면 더 이상 이익이 없습니다.

손절하다

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

EA를 더 자주 다시 시작해야 한다고 생각합니다. 예를 들어, 일주일 동안 총 이익(모든 쌍에서)을 가져갔고 EA는 모든 쌍을 남겼습니다.

모든 쌍에서 새로운 총 이익이 발생할 때까지 Expert Advisor를 다시 시작합니다.

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\

스톱에 대한 또 다른 생각이 있었습니다. 스톱은 포지션을 청산하는 것이 아니라 반대의 (수익성이 없는) 오픈 포지션이 많이 있는 반대 포지션을 여는 것입니다.

다음은 많은 오픈 포지션의 계정입니다.

   int total= PositionsTotal ();
   for ( int i=total- 1 ; i>= 0 ; i--) // returns the number of open positions
     {
       string    position_GetSymbol= PositionGetSymbol (i); // GetSymbol позиции
       if (position_GetSymbol==m_symbol.Name())
        {
         if (m_position.PositionType()== POSITION_TYPE_BUY )
           {
            PROFIT_BUY=PROFIT_BUY+ PositionGetDouble ( POSITION_PROFIT );
            PROFIT_BUY_Lot=PROFIT_BUY_Lot+ PositionGetDouble ( POSITION_VOLUME );
           }
         else
           {
            PROFIT_SELL=PROFIT_SELL+ PositionGetDouble ( POSITION_PROFIT );
            PROFIT_SELL_Lot=PROFIT_SELL_Lot+ PositionGetDouble ( POSITION_VOLUME );
           }
           {
            PROFIT_CLOSE= AccountInfoDouble ( ACCOUNT_PROFIT );
           }
        }
     }
//---

손절매 777

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

완전한 넌센스로 판명됩니다. 요컨대, 손으로 열어야 하며 다른 모든 것은 수동 거래에 도움이 되어야 합니다.