무료로 어드바이저를 작성해 드립니다 - 페이지 155

 
Oltinbek Sohibov # :

안녕하세요 !

이 고문에 대해 도움을 줄 수 있는 사람은 SL 및 TP 및 시간 간격 거래를 추가합니다.

미리 감사합니다

 //--- additional checking
   double sl   = 500 ;
   double tp   = 500 ;
   if (signal!= WRONG_VALUE )
     {
       if ( TerminalInfoInteger ( TERMINAL_TRADE_ALLOWED ) && Bars ( _Symbol , _Period )> 100 )
         ExtTrade.PositionOpen( _Symbol ,signal,TradeSizeOptimized(),
                               SymbolInfoDouble ( _Symbol ,signal== ORDER_TYPE_SELL ? SYMBOL_BID : SYMBOL_ASK ),
                               SymbolInfoDouble ( _Symbol ,sl== ORDER_TYPE_SELL ? SYMBOL_BID : SYMBOL_ASK ),
                               SymbolInfoDouble ( _Symbol ,tp== ORDER_TYPE_SELL ? SYMBOL_BID : SYMBOL_ASK ));
     }
//---

SL 및 TP에 대해 여기에서 무언가를 눈이 멀게 해야 합니다.

 
Oltinbek Sohibov # :

안녕하세요 !

이 고문에 대해 도움을 줄 수 있는 사람은 SL 및 TP 및 시간 간격 거래를 추가합니다.

미리 감사합니다

예에서 https://www.mql5.com/en/docs/constants/structures/mqltraderequest

 //+------------------------------------------------------------------+

//|                                                    MA CCI  1.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"

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

#include <Trade\Trade.mqh>



input double MaximumRisk        = 0.02 ;     // Maximum Risk in percentage

input double DecreaseFactor     = 3 ;       // Descrease factor

input int     MovingPeriod       = 150 ;       // Moving Average period

input int     MovingShift        = 0 ;       // Moving Average shift





input int     ma_period          = 14 ;     // период усреднения

input int     CCI_level_high     = 220 ;

input int     CCI_level_low      = - 220 ;



extern double Max_spread        = 20 ; // максимально допустимый спред при входе

extern int     Sl                = 150 ; // стоплосс - 0-выкл.

extern int     Tp                = 500 ; // тейкпрофит - 0-выкл.

extern double Lots              = 0.01 ; // лот







//---

int     ExtHandle= 0 ;

bool    ExtHedging= false ;

CTrade ExtTrade;



int     CCIHandle= 0 ;





#define MA_MAGIC 1234501

//+------------------------------------------------------------------+

//| Calculate optimal lot size                                       |

//+------------------------------------------------------------------+
double TradeSizeOptimized( void )
  {
   double price= 0.0 ;
   double margin= 0.0 ;
//--- select lot size
   if (! SymbolInfoDouble ( _Symbol , SYMBOL_ASK ,price))
       return ( 0.0 );
   if (! OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 1.0 ,price,margin))
       return ( 0.0 );
   if (margin<= 0.0 )
       return ( 0.0 );
   double lot= NormalizeDouble ( AccountInfoDouble ( ACCOUNT_MARGIN_FREE )*MaximumRisk/margin, 2 );
//--- calculate number of losses orders without a break
   if (DecreaseFactor> 0 )
     {
       //--- select history for access
       HistorySelect ( 0 , TimeCurrent ());
       //---
       int     orders= HistoryDealsTotal ();   // total history deals
       int     losses= 0 ;                     // number of losses orders without a break
       for ( int i=orders- 1 ; i>= 0 ; i--)
        {
         ulong ticket= HistoryDealGetTicket (i);
         if (ticket== 0 )
           {
             Print ( "HistoryDealGetTicket failed, no trade history" );
             break ;
           }
         //--- check symbol
         if ( HistoryDealGetString (ticket, DEAL_SYMBOL )!= _Symbol )
             continue ;
         //--- check Expert Magic number
         if ( HistoryDealGetInteger (ticket, DEAL_MAGIC )!=MA_MAGIC)
             continue ;
         //--- check profit
         double profit= HistoryDealGetDouble (ticket, DEAL_PROFIT );
         if (profit> 0.0 )
             break ;
         if (profit< 0.0 )
            losses++;
        }
       //---
       if (losses> 1 )
         lot= NormalizeDouble (lot-lot*losses/DecreaseFactor, 1 );
     }
//--- normalize and check limits
   double stepvol= SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_STEP );
   lot=stepvol* NormalizeDouble (lot/stepvol, 0 );
   double minvol= SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MIN );
   if (lot<minvol)
      lot=minvol;
   double maxvol= SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MAX );
   if (lot>maxvol)
      lot=maxvol;
//--- return trading volume
   return (lot);
  }
//+------------------------------------------------------------------+

//| Check for open position conditions                               |

//+------------------------------------------------------------------+
void CheckForOpen( void )

  {
   MqlRates rt[ 2 ];
//--- go trading only for first ticks of new bar
   if ( CopyRates ( _Symbol , _Period , 0 , 2 ,rt)!= 2 )
     {
       Print ( "CopyRates of " , _Symbol , " failed, no history" );
       return ;
     }
   if (rt[ 1 ].tick_volume> 1 )
       return ;
//--- get current Moving Average
   double    ma[ 1 ];
   if ( CopyBuffer (ExtHandle, 0 , 0 , 1 ,ma)!= 1 )
     {
       Print ( "CopyBuffer from iMA failed, no data" );
       return ;
     }
//--- check signals
   ENUM_ORDER_TYPE signal= WRONG_VALUE ;
   if (rt[ 0 ].open>ma[ 0 ] && rt[ 0 ].close<ma[ 0 ] && ma_period<CCI_level_high)           // && ma_period>CCI_level_high
      signal= ORDER_TYPE_SELL ;     // sell conditions
   else
     {
       if (rt[ 0 ].open<ma[ 0 ] && rt[ 0 ].close>ma[ 0 ]  &&  ma_period>CCI_level_low)         // &&  ma_period<CCI_level_low
         signal= ORDER_TYPE_BUY ;   // buy conditions
     }
//--- additional checking
   if (signal!= WRONG_VALUE )
     {
       if ( TerminalInfoInteger ( TERMINAL_TRADE_ALLOWED ) && Bars ( _Symbol , _Period )> 100 )
         ExtTrade.PositionOpen( _Symbol ,signal,TradeSizeOptimized(),
                               SymbolInfoDouble ( _Symbol ,signal== ORDER_TYPE_SELL ? SYMBOL_BID : SYMBOL_ASK ),
                               0 , 0 );
     }
//---
  }
//+------------------------------------------------------------------+

//| Check for close position conditions                              |

//+------------------------------------------------------------------+
void CheckForClose( void )

  {
   MqlRates rt[ 2 ];
//--- go trading only for first ticks of new bar
   if ( CopyRates ( _Symbol , _Period , 0 , 2 ,rt)!= 2 )
     {
       Print ( "CopyRates of " , _Symbol , " failed, no history" );
       return ;
     }
   if (rt[ 1 ].tick_volume> 1 )
       return ;
//--- get current Moving Average
   double    ma[ 1 ];
   if ( CopyBuffer (ExtHandle, 0 , 0 , 1 ,ma)!= 1 )
     {
       Print ( "CopyBuffer from iMA failed, no data" );
       return ;
     }
//--- positions already selected before
   bool signal= false ;
   long type= PositionGetInteger ( POSITION_TYPE );
   if (type==( long ) POSITION_TYPE_BUY && rt[ 0 ].open>ma[ 0 ] && rt[ 0 ].close<ma[ 0 ])         //
      signal= true ;
   if (type==( long ) POSITION_TYPE_SELL && rt[ 0 ].open<ma[ 0 ] && rt[ 0 ].close>ma[ 0 ])       //
      signal= true ;
//--- additional checking
   if (signal)
     {
       if ( TerminalInfoInteger ( TERMINAL_TRADE_ALLOWED ) && Bars ( _Symbol , _Period )> 100 )
         ExtTrade.PositionClose( _Symbol , 3 );
     }
//---
  }
//+------------------------------------------------------------------+

//| Position select depending on netting or hedging                  |

//+------------------------------------------------------------------+
bool SelectPosition()

  {
   bool res= false ;
//--- check position in Hedging mode
   if (ExtHedging)
     {
       uint total= PositionsTotal ();
       for ( uint i= 0 ; i<total; i++)
        {
         string position_symbol= PositionGetSymbol (i);
         if ( _Symbol ==position_symbol && MA_MAGIC== PositionGetInteger ( POSITION_MAGIC ))
           {
            res= true ;
             break ;
           }
        }
     }
//--- check position in Netting mode
   else
     {
       if (! PositionSelect ( _Symbol ))
         return ( false );
       else
         return ( PositionGetInteger ( POSITION_MAGIC )==MA_MAGIC); //---check Magic number
     }
//--- result for Hedging mode
   return (res);
  }

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+
int OnInit ( void )

  {
//--- prepare trade class to control positions if hedging mode is active
   ExtHedging=(( ENUM_ACCOUNT_MARGIN_MODE ) AccountInfoInteger ( ACCOUNT_MARGIN_MODE )== ACCOUNT_MARGIN_MODE_RETAIL_HEDGING );
   ExtTrade.SetExpertMagicNumber(MA_MAGIC);
   ExtTrade.SetMarginMode();
   ExtTrade.SetTypeFillingBySymbol( Symbol ());
//--- Moving Average indicator
   ExtHandle= iMA ( _Symbol , _Period ,MovingPeriod,MovingShift, MODE_SMA , PRICE_CLOSE );
   if (ExtHandle== INVALID_HANDLE )
     {
       printf ( "Error creating MA indicator" );
       return ( INIT_FAILED );
     }
//--- индикатора Commodity Channel Index
   CCIHandle= iCCI ( _Symbol , _Period ,ma_period, _AppliedTo );
   if (CCIHandle== INVALID_HANDLE )
     {
       printf ( "Error creating CCI indicator" );
       return ( INIT_FAILED );
     }
//--- ok
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+
void OnTick ( void )

  {
//---
   if (SelectPosition())
      CheckForClose();
   else
      CheckForOpen();
   OnStartsltp();
//---
  }
//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+
void OnDeinit ( const int reason)

  {
  }
//+------------------------------------------------------------------+
//| Модификация Stop Loss и Take Profit позиции                      |
//+------------------------------------------------------------------+
void OnStartsltp()
  {
//--- объявление запроса и результата
   MqlTradeRequest request;
   MqlTradeResult   result;
   int total= PositionsTotal (); // количество открытых позиций
//--- перебор всех открытых позиций
   for ( int i= 0 ; i<total; i++)
     {
       //--- параметры ордера
       ulong   position_ticket= PositionGetTicket (i); // тикет позиции
       string position_symbol= PositionGetString ( POSITION_SYMBOL ); // символ
       int     digits=( int ) SymbolInfoInteger (position_symbol, SYMBOL_DIGITS ); // количество знаков после запятой
       ulong   magic= PositionGetInteger ( POSITION_MAGIC ); // MagicNumber позиции
       double volume= PositionGetDouble ( POSITION_VOLUME );     // объем позиции
       double sl= PositionGetDouble ( POSITION_SL );   // Stop Loss позиции
       double tp= PositionGetDouble ( POSITION_TP );   // Take Profit позиции
       ENUM_POSITION_TYPE type=( ENUM_POSITION_TYPE ) PositionGetInteger ( POSITION_TYPE );   // тип позиции
       //--- вывод информации о позиции
       PrintFormat ( "#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s  [%I64d]" ,
                  position_ticket,
                  position_symbol,
                   EnumToString (type),
                  volume,
                   DoubleToString ( PositionGetDouble ( POSITION_PRICE_OPEN ),digits),
                   DoubleToString (sl,digits),
                   DoubleToString (tp,digits),
                  magic);
       //--- если MagicNumber совпадает, Stop Loss и Take Profit не заданы
       if (magic==MA_MAGIC && sl== 0 && tp== 0 )
        {
         //--- вычисление текущих ценовых уровней
         double price= PositionGetDouble ( POSITION_PRICE_OPEN );
         double bid= SymbolInfoDouble (position_symbol, SYMBOL_BID );
         double ask= SymbolInfoDouble (position_symbol, SYMBOL_ASK );
         int     stop_level=( int ) SymbolInfoInteger (position_symbol, SYMBOL_TRADE_STOPS_LEVEL );
         double price_level;
         //--- если уровень минимально допустимого отступа в пунктах от текущей цены закрытия не задан
         if (stop_level<= 0 )
            stop_level= 150 ; // зададим отступ в 150 пунктов от текущей цены закрытия
         else
            stop_level+= 50 ; // уровень отступа возьмем равным (SYMBOL_TRADE_STOPS_LEVEL + 50) пунктов для надежности
         //--- вычисление и округление значений Stop Loss и Take Profit
         price_level=stop_level* SymbolInfoDouble (position_symbol, SYMBOL_POINT );
         if (type== POSITION_TYPE_BUY )
           {
            sl= NormalizeDouble (bid-price_level,digits);
            tp= NormalizeDouble (bid+price_level,digits);
           }
         else
           {
            sl= NormalizeDouble (ask+price_level,digits);
            tp= NormalizeDouble (ask-price_level,digits);
           }
         //--- обнуление значений запроса и результата
         ZeroMemory (request);
         ZeroMemory (result);
         //--- установка параметров операции
         request.action  = TRADE_ACTION_SLTP ; // тип торговой операции
         request.position=position_ticket;   // тикет позиции
         request.symbol=position_symbol;     // символ
         request.sl      =sl;                 // Stop Loss позиции
         request.tp      =tp;                 // Take Profit позиции
         request.magic=MA_MAGIC;         // MagicNumber позиции
         //--- вывод информации о модификации
         PrintFormat ( "Modify #%I64d %s %s" ,position_ticket,position_symbol, EnumToString (type));
         //--- отправка запроса
         if (! OrderSend (request,result))
             PrintFormat ( "OrderSend error %d" , GetLastError ());   // если отправить запрос не удалось, вывести код ошибки
         //--- информация об операции
         PrintFormat ( "retcode=%u  deal=%I64u  order=%I64u" ,result.retcode,result.deal,result.order);
        }
     }
  }
//+------------------------------------------------------------------+

스크린샷_2021-09-03_20-24-38.png 122.9kB 1366 x 768픽셀

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Структура торгового запроса - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Anton Yakovlev :
당신이 좋은 전략을 가지고 있고 그것을 공유할 준비가 되어 있다면, 나는 조언자를 쓸 수 있습니다. 공개 토론에 초대합니다
안녕하세요, 특정 촛대 움직임과 함께 촛대 패턴 (패턴, 움직임, 나는 그것을 달리 무엇이라고 부를지 모르겠습니다)을 기반으로 지표 를 작성한 다음 다음 수정 사항으로이 지표에 대한 Expert Advisor를 작성하는 것이 가능합니까?. 감사합니다
 

안녕하세요 !

대단히 감사합니다. 예를 들어 그가 거래한 12시에서 20시까지 거래 시간을 추가할 수도 있습니다.

감사합니다

 

안녕하세요!

가장 간단한 조언자를 쓰거나 (아날로그가있는 경우) 보내주십시오.

상태:

지정된 시간에 양방향으로 지정가 주문을 합니다. 모든 것))

테스터에서 운전하고 싶으므로 최적화를 위한 매개변수를 추가하십시오.

- 제한 시간 설정(시간만, 정수로 충분)
- 모든 제한 해제 시간(시장에 있는 제한 포함 - 강제 폐쇄)
- 양쪽에 설정된 제한 수(즉, 숫자를 3으로 설정하면 양쪽에 3개의 제한이 설정됨)
- 가격에서 첫 번째 한계 한계까지의 거리
- 한계 사이의 단계(나머지, 즉, 1,2,3... 사이)
- SL 및 TP

나는 매우 감사하게 될 것입니다.

 
Ivan Butko # :

안녕하세요!

가장 간단한 조언자를 쓰거나 (아날로그가있는 경우) 보내주십시오.

상태:

지정된 시간에 양방향으로 지정가 주문을 합니다. 모든 것))

테스터에서 운전하고 싶으므로 최적화를 위한 매개변수를 추가하십시오.

- 제한 시간 설정(시간만, 정수로 충분)
- 모든 제한 해제 시간(시장에 있는 제한 포함 - 강제 폐쇄)
- 양쪽에 설정된 제한 수(즉, 숫자를 3으로 설정하면 양쪽에 3개의 제한이 설정됨)
- 가격에서 첫 번째 한계 한계까지의 거리
- 한계 사이의 단계(나머지, 즉, 1,2,3... 사이)
- SL 및 TP

나는 매우 감사하게 될 것입니다.

양쪽에서 한 번만 주문하십시오. 그리고 트롤.

파일:
 
Valeriy Yastremskiy # :

양쪽에서 한 번만 주문합니다. 그리고 트롤.

거기에서 아이디어는 평평한 야간 트래픽을 모두 가져가는 것이므로 몇 가지 제한 이 설정 됩니다. 어쨌든 프로그램의 아날로그에 감사드립니다.

불행히도 테스트 및 최적화 시 "2021.09.09 16:39:38.084" 충돌 2021.01.04 07:00:00 Time_Open_Trail_3_21 EURUSD,H1: 경고: 주문 시작 시간이 현재 시간보다 짧습니다. 전문 고문이 작동하지 않습니다."

나는 시간을 설정하려고했습니다. 과거와 새로운 시간 모두 여전히 그렇게 씁니다.


 
Ivan Butko # :

거기에서 아이디어는 평평한 야간 트래픽을 모두 가져가는 것이므로 몇 가지 제한 이 설정 됩니다. 어쨌든 프로그램의 아날로그에 감사드립니다.

불행히도 테스트 및 최적화 시 "2021.09.09 16:39:38.084" 충돌 2021.01.04 07:00:00 Time_Open_Trail_3_21 EURUSD,H1: 경고: 주문 시작 시간이 현재 시간보다 짧습니다. 전문 고문이 작동하지 않습니다."

나는 시간을 설정하려고했습니다. 과거와 새로운 시간 모두 여전히 그렇게 씁니다.


터미널 시간과 현지 시간의 차이를 고려합니까? 설정한 시간보다 늦은 시간을 기록합니다. 검사를 받고 있습니다.

테스터에서 보류 중인 주문은 단순히 배치됩니다. 이것은 시장을 위해 한 것입니다.

추신. 날짜에 오류가 있습니다) 4월 1일이 날짜입니다. )

ZyZy 테스터에서는 미리 날짜를 설정할 수 없으며, 테스터의 OnInit에서는 초기에 이미 지나간 테스트 중인 시간이 아니라 터미널 시간입니다.

 
Valeriy Yastremskiy # :

터미널 시간과 현지 시간의 차이를 고려합니까? 설정한 시간보다 늦은 시간을 기록합니다. 검사를 받고 있습니다.

테스터에서 보류 중인 주문은 단순히 배치됩니다. 이것은 시장을 위해 한 것입니다.

위협. 날짜에 오류가 있습니다) 4월 1일이 날짜입니다. )

ZyZy 테스터에서는 미리 날짜를 설정할 수 없으며, 테스터의 OnInit에서는 초기에 이미 지나간 테스트 중인 시간이 아니라 터미널 시간입니다.

분명히 터미널은 다른 시간 형식을 가지고 있습니다. 테스트를 2021년 1월 1일부터 설정하고 시작하여 2021.01.04(1월 4일부터)를 씁니다.)


 
Ivan Butko # :

분명히 터미널은 다른 시간 형식을 가지고 있습니다. 테스트를 2021년 1월 1일부터 설정하고 시작하여 2021.01.04(1월 4일부터)를 씁니다.)


참고로 테스터에서 보고싶다면 실물보다 잠시 후 체크를 제거하시면 됩니다. OnInit에 있습니다. 그리고 테스터의 4k에서 현재 시간에 대한 요청이 테스터의 시간을 반환하는지 기억나지 않습니다. 제 생각에는 현재 시간을 반환하므로 테스터에서는 주문이 즉시 거기에 배치됩니다. 또한 현지 시간을 쿼리하면 현재 현지 시간이 반환됩니다.

이것은 환경의 완전한 에뮬레이터 테스터에서 5k에 있습니다.