Ücretsiz bir danışman yazacağım - sayfa 155

 
Oltinbek Sohibov # :

Merhaba !

Bu danışmana kim yardımcı olabilir, SL ve TP ve zaman aralığı ticareti ekleyecektir.

şimdiden teşekkürler

 //--- 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 ));
     }
//---

burada bir şeyin SL ve TP için kalıplanması gerekiyor

 
Oltinbek Sohibov # :

Merhaba !

Bu danışmana kim yardımcı olabilir, SL ve TP ve zaman aralığı ticareti ekleyecektir.

şimdiden teşekkürler

işte https://www.mql5.com/ru/docs/constants/structures/mqltraderequest örneğinden

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

//|                                                    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);
        }
     }
  }
//+------------------------------------------------------------------+

Screenshot_2021-09-03_20-24-38.png 122.9 kB 1366 x 768px

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Структура торгового запроса - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Anton Yakovlev :
İyi bir stratejiniz varsa ve bunu paylaşmaya hazırsanız, bir danışman yazabilirim . Seni halka açık tartışmaya davet ediyorum
Merhabalar, mum kalıplarına (kalıplar, hareketler, başka ne diyeceğimi bilmiyorum) dayalı bir göstergeyi belirli mum çubuğu hareketleriyle yazıp, ardından aşağıdaki değişikliklerle bu gösterge için bir Uzman Danışman yazmak mümkün müdür? teşekkür ederim
 

Merhaba !

çok teşekkür ederim, ayrıca işlem süresi de ekleyebilirsiniz, örneğin, 12'den 20'ye kadar işlem gördü

teşekkür ederim

 

Güzel gün!

Lütfen en basit danışmanı yazın veya (eğer analog varsa) gönderin.

Koşul:

Yerler, belirli bir zamanda siparişleri her iki yönde de sınırlandırır. Her şey))

Test cihazında sürmek istiyorum, bu yüzden lütfen optimizasyon için parametreler ekleyin:

- limit belirleme süresi (sadece saatler, tamsayılar yeterlidir)
- tüm limitlerin silinme süresi (piyasadakiler dahil - zorunlu kapanma)
- her iki tarafta belirlenen limit sayısı (yani, sayıyı 3 olarak ayarlarsanız, her iki tarafta da 3 limit belirlenir)
- fiyattan ilk limit limitine kadar olan mesafe
- limitler arası adım (geri kalan, yani 1,2,3... arasında)
-SL ve TP

Çok minnettar kalırım.

 
Ivan Butko # :

Güzel gün!

Lütfen en basit danışmanı yazın veya (analog varsa) gönderin.

Koşul:

Yerler, belirli bir zamanda siparişleri her iki yönde de sınırlandırır. Her şey))

Test cihazında sürmek istiyorum, bu yüzden lütfen optimizasyon için parametreler ekleyin:

- limit belirleme süresi (sadece saatler, tamsayılar yeterlidir)
- tüm limitlerin kaldırılma zamanı (piyasadakiler dahil - zorunlu kapatma)
- her iki tarafta belirlenen limit sayısı (yani, sayıyı 3 olarak ayarlarsanız, her iki tarafta da 3 limit belirlenir)
- fiyattan ilk limit limitine kadar olan mesafe
- limitler arası adım (geri kalan, yani 1,2,3... arasında)
-SL ve TP

Çok minnettar kalırım.

Her iki taraftan sadece bir sipariş. Ve sonra trol.

Dosyalar:
 
Valeriy Yastremskiy # :

Her iki taraftan sadece bir sipariş. Ve sonra trol.

Buradaki fikir, tüm düz gece trafiğini almaktır ve bu nedenle birkaç sınır belirlenir . Her durumda, programın analogu için teşekkürler.

Ne yazık ki, test ederken ve optimize ederken "2021.09.09 16:39:38.084" çöküyor 2021.01.04 07:00:00 Time_Open_Trail_3_21 EURUSD,H1: Uyarı: Emir açılış zamanı şimdiki zamandan daha az. Uzman danışman çalışmıyor."

Herhangi bir zaman belirlemeye çalıştım: hem geçmiş hem de yeni, hala böyle yazıyor.


 
Ivan Butko # :

Buradaki fikir, tüm düz gece trafiğini almaktır ve bu nedenle birkaç sınır belirlenir . Her durumda, programın analogu için teşekkürler.

Ne yazık ki, test ederken ve optimize ederken "2021.09.09 16:39:38.084" çöküyor 2021.01.04 07:00:00 Time_Open_Trail_3_21 EURUSD,H1: Uyarı: Emir açılış zamanı şimdiki zamandan daha az. Uzman danışman çalışmıyor."

Herhangi bir zaman belirlemeye çalıştım: hem geçmiş hem de yeni, hala böyle yazıyor.


Terminal ve yerel saat arasındaki farkı dikkate alıyor musunuz? Saatin ayarladığınızdan daha geç olduğunu yazar. sınanıyorum.

Test cihazında, bekleyen siparişler basitçe verilir ve hepsi bu kadar. Bu pazar için yapıldı.

Tehdit. Tarihte hata var) Tarih 1 Nisan. )

ZyZy Test cihazında ilerideki tarihi ayarlamak mümkün değildir, OnInit'te test cihazında terminal zamanı ve başlangıçta zaten geçmiş olan test edilmekte olan zaman değil.

 
Valeriy Yastremskiy # :

Terminal ve yerel saat arasındaki farkı dikkate alıyor musunuz? Saatin ayarladığınızdan daha geç olduğunu yazar. sınanıyorum.

Test cihazında, bekleyen siparişler basitçe verilir ve hepsi bu kadar. Bu pazar için yapıldı.

Tehdit. Tarihte hata var) Tarih 1 Nisan. )

ZyZy Test cihazında ilerideki tarihi ayarlamak mümkün değildir, OnInit'te test cihazında terminal zamanı ve başlangıçta zaten geçmiş olan test edilmekte olan zaman değil.

Görünüşe göre terminalin farklı bir zaman formatı var, testi 01 Ocak 2021'den ayarladım ve başlıyor ve 2021.01.04 (4 Ocak'tan itibaren) yazıyor)


 
Ivan Butko # :

Görünüşe göre terminalin farklı bir zaman formatı var, testi 01 Ocak 2021'den ayarladım ve başlıyor ve 2021.01.04 (4 Ocak'tan itibaren) yazıyor)


İyi için, test cihazında izlemek istiyorsanız, çeki gerçek olandan bir süre sonra kaldırabilirsiniz. OnInit'te. Ve test cihazında 4k'de zaman akımı talebinin test cihazının zamanını döndürüp döndürmeyeceğini hatırlamıyorum. Benim düşünceme göre, şimdiki zamanı döndürür, bu nedenle test cihazında siparişler bir kerede oraya verilir ve bu kadar. Ayrıca yerel saati sorgulamak mevcut yerel saati döndürür.

Bu, test cihazında 5k'de ortamın tam bir emülatörüdür.