초보자의 질문 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

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

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

사유: