Ich schreibe kostenlos einen Ratgeber - Seite 155

 
Oltinbek Sohibov #:

Hallo!

Wer kann helfen, SL und TP und Zeitrahmen Handel auf dieser EA hinzufügen!

Ich danke Ihnen vielmals

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

Ich muss einige Anpassungen an der SL und TP vornehmen

 
Oltinbek Sohibov # :

Hallo !

Wer bei diesem Berater helfen kann, wird SL und TP und Zeitintervallhandel hinzufügen

Vielen Dank im Voraus

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

Screenshot_2021-09-03_20-24-38.png 122,9 kB 1366 x 768px

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Структура торгового запроса - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Anton Yakovlev:
Wenn Sie eine gute Strategie haben und bereit sind, sie mit anderen zu teilen, kann ich einen EA schreiben. Ich lade Sie ein, ihn öffentlich zu diskutieren
Hallo, ist es möglich, einen Indikator zu schreiben, der auf Candlestick-Mustern basiert (Muster, Bewegungen, ich weiß nicht, wie ich sie sonst nennen soll), mit bestimmten Candlestick-Bewegungen und dann einen EA für diesen Indikator mit den folgenden Änderungen zu schreiben?
 

Hallo!

Vielen Dank, können Sie mehr Handelszeit zum Beispiel von 12 bis 20 er gehandelt hinzufügen

Dankeschön

 

Guten Tag!

Bitte schreiben oder senden Sie (wenn es ein Analogon gibt) einen einfachen Expert Advisor.

Bedingung:

Zu einem bestimmten Zeitpunkt setzt die Limit-Orders in beide Richtungen. Alles))

Ich möchte in einem Tester zu verwenden, so fügen Sie bitte Parameter für die Optimierung:

- Zeit der Begrenzer Einstellung (nur Stunden sind genug, ganze Zahlen)
- Zeit, um alle Begrenzer zu löschen (einschließlich derjenigen in den Markt - erzwungene Schließung)
- Anzahl der Begrenzer von beiden Seiten gesetzt (dh, wenn Sie 3, 3 Begrenzer werden auf beiden Seiten gesetzt werden)
- Abstand vom Preis zu den ersten Begrenzer
- Schritt zwischen Limits (der Rest, dh zwischen 1, 2, 3...... )
- SL und TP

Es wäre sehr zu schätzen.

 
Ivan Butko #:

Guten Tag!

Bitte schreiben oder senden Sie (wenn es ein Analogon gibt) einen einfachen Expert Advisor.

Bedingung:

Zu einem bestimmten Zeitpunkt setzt die Limit-Orders in beide Richtungen. Alles))

Ich möchte in einem Tester zu verwenden, so fügen Sie bitte Parameter für die Optimierung:

- Zeit der Begrenzer Einstellung (nur Stunden sind genug, ganze Zahlen)
- Zeit, um alle Begrenzer zu löschen (einschließlich derjenigen in den Markt - erzwungene Schließung)
- Anzahl der Begrenzer von beiden Seiten gesetzt (dh, wenn Sie 3, 3 Begrenzer werden auf beiden Seiten gesetzt werden)
- Abstand vom Preis zu den ersten Begrenzer
- Schritt zwischen Limits (der Rest, dh zwischen 1, 2, 3...... )
- SL und TP

Es wäre sehr zu schätzen.

Nur ein Auftrag auf beiden Seiten. Und danach eine Schleppnetzfahndung.

Dateien:
 
Valeriy Yastremskiy #:

Nur ein Haftbefehl auf beiden Seiten. Und danach eine Schleppnetzfahndung.

Die Idee dabei ist, alle flachen Bewegungen über Nacht aufzufangen, und so werden mehrere Grenzen gesetzt. Wie auch immer, vielen Dank für das Programm analog.

Leider, beim Testen und Optimieren es, die "2021.09.09 16:39:38.084 2021.01.04 07:00:00 Time_Open_Trail_3_21 EURUSD,H1: Alert: Die Zeit der Ordereröffnung ist kleiner als die aktuelle Zeit. Der Expert Advisor funktioniert nicht.

Ich habe versucht, eine beliebige Zeit einzustellen: sowohl die vergangene als auch die neue, sie sagt immer noch so.


 
Ivan Butko #:

Die Idee dabei ist, alle flachen nächtlichen Bewegungen aufzusammeln, und so werden ein paar Grenzen aufgedeckt. Wie auch immer, vielen Dank für das Programm analog.

Leider, beim Testen und Optimieren es, die "2021.09.09 16:39:38.084 2021.01.04 07:00:00 Time_Open_Trail_3_21 EURUSD,H1: Alert: Die Zeit der Ordereröffnung ist kleiner als die aktuelle Zeit. Der Expert Advisor funktioniert nicht.

Ich habe versucht, eine beliebige Zeit einzustellen: sowohl die vergangene als auch die neue Zeit, und erhalte immer noch die gleiche Meldung.


Berücksichtigen Sie den Unterschied zwischen Terminalzeit und Ortszeit? Sie sagt, dass diese Zeit später ist als die eingestellte. Ich habe die Testpässe.

Ich habe eine sehr gute Zeit im Tester, ich habe nur ausstehende Bestellungen aufgegeben, das ist alles. Es wurde für den Markt gemacht.

Zy. (Ihr Datum ist falsch.) Es ist der 1. April. )

ZyZy Im Tester ist es nicht möglich, das Datum vorwärts zu setzen, im OnInit des Testers wird die Terminalzeit, nicht die getestete Zeit, die zunächst schon vergangen ist.

 
Valeriy Yastremskiy #:

Berücksichtigen Sie den Unterschied zwischen der Terminalzeit und der Ortszeit? Sie sagt, dass die Zeit später ist als die, die Sie eingestellt haben. Ich überprüfe es.

Ich gebe nur die ausstehenden Aufträge in das Prüfgerät ein, das ist alles. Es wurde für den Markt gemacht.

Zy. (Ihr Datum ist falsch.) Es ist der 1. April. )

ZyZy Im Tester ist es nicht möglich, das Datum vorwärts zu setzen, in OnInit im Tester die Terminalzeit, nicht die zu testende Zeit, die ursprünglich schon vergangen ist.

Offenbar ein anderes Zeitformat im Terminal, ich habe den Test vom 01. Januar 2021, aber es beginnt und schreibt 2021.01.04 (vom 4. Januar)))


 
Ivan Butko #:

Anscheinend unterschiedliches Zeitformat des Terminals, ich setze den Test vom 01. Januar 2021 und er startet und schreibt 2021.01.04 (vom 4. Januar)))


Das Gute daran ist, dass Sie den Test für eine spätere Zeit als die tatsächliche Zeit entfernen können, wenn Sie ihn im Prüfgerät beobachten möchten. Dies geschieht in OnInit. Und ich erinnere mich nicht genau, ob in 4ka in der Tester-Zeit-Anfrage timecarrent die Tester-Zeit zurückgeben wird. Ich denke, es wird die aktuelle Zeit zurückgeben, so dass im Tester nur Bestellungen auf einmal aufgegeben werden und das war's. Auch bei der Abfrage der Ortszeit wird die aktuelle Ortszeit angezeigt.

Dies ist in der 5k im Tester ein kompletter Umgebungsemulator.

Grund der Beschwerde: