Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1203

 
Alexey Belyakov:

Par ici ? Ou dois-je déclarer quelque chose d'autre dans OnInit ?

Non,toutes les lignes de OnInitsont cachées par défaut:

int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  hLine.Color(clrDarkViolet);
  lLine.Create(0, "lLine", 0, 0);
  lLine.Color(clrDodgerBlue);
  return(INIT_SUCCEEDED);
}
 
Mihail Matkovskij:

Non,toutes les lignes sont cachées par défaut dansOnInit:

La condition est ignorée pour une raison quelconque. Même si j'ai défini une ouverture de poste.

La variable PRL ne peut pas être retirée et placée dans une condition.


if (c0<PRL)  
{
MqlTradeRequest request ={0};
MqlTradeResult  result= {0};
      request.action   =TRADE_ACTION_DEAL;                         // тип торговой операции
      request.symbol   =Symbol();                                 // символ
      request.volume   =1;                                       // объем в 1 лот
      request.type     =ORDER_TYPE_SELL;                         // тип ордера
      request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия
      request.deviation=3;
      request.sl    = NormalizeDouble(Bid+50*_Point,_Digits);
      request.tp    = NormalizeDouble(Bid-50*_Point,_Digits);
      if(!OrderSend(request,result))
         PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки

J'essaie de l'extraire d'une manière ou d'une autre avec GlobalVariableGet . Mais d'une manière ou d'une autre, c'est douteux...

Même quand je le mets à l'intérieur de la condition. Le prix minimum est déjà fixé. Mais il refuse toujours obstinément d'ouvrir la position.


//+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine, lLine;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  hLine.Color(clrDarkViolet);
  lLine.Create(0, "lLine", 0, 0);
  lLine.Color(clrDodgerBlue);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  double   rt = 0;
  double   rs1 = 0;
  double   rs2 = 0;
  double   PRH=0;
  double   PRL=0;
  double   Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double  Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);

  rt=MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1=MathAbs(h1 - c1) / Point();// размер верхней тени свечи
  rs2=MathAbs(l1 - c1) / Point();// размер нижней тени свечи

  if ((rs1 >= rt) && (c1 > o1)) //условия для растущих свечей
  {
    PRH = iHigh(NULL, PERIOD_CURRENT, 1); // то это будет максимум
    hLine.Price(0, PRH);
  }
  
if ((rs2 >= rt) && (c1 < o1)) //условия для падающих свечей 
  {
PRL = iLow(NULL, PERIOD_CURRENT, 1);
lLine.Price(0, PRL);
 
  
  
  // double a=GlobalVariableGet("i",PRL); 
Comment(" =======",PRL,"\n");

if (c0<PRL)  
{
MqlTradeRequest request={0};
MqlTradeResult  result={0};
      request.action   =TRADE_ACTION_DEAL;                         // тип торговой операции
      request.symbol   =Symbol();                                 // символ
      request.volume   =1;                                       // объем в 1 лот
      request.type     =ORDER_TYPE_SELL;                         // тип ордера
      request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия
      request.deviation=3;
      request.sl    = NormalizeDouble(Bid+50*_Point,_Digits);
      request.tp    = NormalizeDouble(Bid-50*_Point,_Digits);
      if(!OrderSend(request,result))
         PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки;
}
}
}
//+------------------------------------------------------------------+
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Alexey Belyakov:

La condition est ignorée pour une raison quelconque. Même si j'ai défini une ouverture de poste.

La variable PRL ne peut pas être arrachée et placée dans une condition.


PRL, vous avez Low à l'offset 1
PRL = iLow(NULL, PERIOD_CURRENT, 1);
PRH, c'est un High à l'offset 1
PRH = iHigh(NULL, PERIOD_CURRENT, 1);

Nous obtenons l'image suivante :

void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  double   rt = 0;
  double   rs1 = 0;
  double   rs2 = 0;
  double   PRH;
  double   PRL;

  rt=MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1=MathAbs(h1 - c1) / Point();// размер верхней тени свечи
  rs2=MathAbs(l1 - c1) / Point();// размер нижней тени свечи

  if ((rs1 >= rt) && (c1 > o1)) //условия для растущих свечей
  {
    PRH = iHigh(NULL, PERIOD_CURRENT, 1); // то это будет максимум
    hLine.Price(0, PRH);
  }
  
  if ((rs2 >= rt) && (c1 < o1)) //условия для падающих свечей 
  {
    PRL = iLow(NULL, PERIOD_CURRENT, 1);
    lLine.Price(0, PRL);  
  }
}

Par conséquent, au lieu dePRL, vous pouvez prendre iLow(NULL, PERIOD_CURRENT, 1) ou l1.

J'ai l'impression que l'écriture de code ne vous intéresse pas et que vous ne comprenez pas ce que vous faites. Un peu de patience et vous pourrez facilement comprendre tout cela. Nettoyez votre code et de nombreuses questions disparaîtront d'elles-mêmes. Si vous ne parvenez pas à comprendre ce qui n'a pas fonctionné, il y a aussi le débogage, qui est un outil très puissant pour un programmeur. Allez jusqu'au bout de ce que vous faites et posez ensuite des questions.

 
Alexey Belyakov:

La condition est ignorée pour une raison quelconque. Même si j'ai défini une ouverture de poste.

La PRL variable ne peut pas être arrachée et mise dans une condition.


J'essaie de l'extraire d'une manière ou d'une autre avec GlobalVariableGet . Mais d'une manière ou d'une autre, c'est douteux...

Même quand je le mets à l'intérieur de la condition. Le prix minimum est déjà fixé. Je ne veux toujours pas ouvrir une position.


Alors, pourquoi dois-je d'abord écrire un message et ensuite le modifier ?

 
Alexey Belyakov:

La condition est ignorée pour une raison quelconque. Même si j'ai défini une ouverture de poste.

La PRL variable ne peut pas être arrachée et placée dans une condition.


J'essaie de l'extraire d'une manière ou d'une autre avec GlobalVariableGet . Mais d'une manière ou d'une autre, c'est douteux...

Même quand je le mets à l'intérieur de la condition. Le prix minimum est déjà fixé. Je ne veux toujours pas ouvrir une position.


L'algorithme de votre code était initialement faux, ainsi que l'algorithme d'entrée sur le marché. Je l'ai corrigé.

//+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine, lLine;

double   PRH = 0;
double   PRL = 0;

double entryPRL = 0;
double entryPRH = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  hLine.Color(clrDarkViolet);
  lLine.Create(0, "lLine", 0, 0);
  lLine.Color(clrDodgerBlue);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  
  double   rt = 0;
  double   rs1 = 0;
  double   rs2 = 0;
  
  double   Ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
  double  Bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
  
  rt = MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1 = MathAbs(h1 - c1) / Point(); // размер верхней тени свечи
  rs2 = MathAbs(l1 - c1) / Point(); // размер нижней тени свечи
  
  if ((rs1 >= rt) && (c1 > o1)) { //условия для растущих свечей
    PRH = h1; // то это будет максимум
    hLine.Price(0, PRH);
  }
  
  if ((rs2 >= rt) && (c1 < o1)) { //условия для падающих свечей
    PRL = l1;
    lLine.Price(0, PRL);
    // double a=GlobalVariableGet("i",PRL);
    Comment(" =======", PRL, "\n");
  }
  
  if (PRL > 0 && c0 < PRL && PRL != entryPRL) {
     MqlTradeRequest request={0};
     MqlTradeResult  result={0};

     request.action   =TRADE_ACTION_DEAL;                     
     request.symbol   =Symbol();                          
     request.volume   =0.1;                                   
     request.type     =ORDER_TYPE_SELL;                       
     request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID); 
     request.deviation= 5;                                    
     request.magic    = 0;                         

     if(OrderSend(request,result))
       entryPRL = PRL;
     else
       PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки

  }
}
//+------------------------------------------------------------------+

Mais ce code aura besoin de beaucoup de révisions pour pouvoir l'utiliser dans le trading réel...

 
Mihail Matkovskij:

Dans votre code, l'algorithme lui-même était initialement faux, ainsi que l'algorithme d'entrée sur le marché. Corrigé.

Mais pour utiliser ce code dans le trading réel, vous aurez besoin de beaucoup de révisions...

Très cool ! Merci ! En regardant ici en même temps, le problème des entrées multiples est résolu. Il fonctionne comme il se doit maintenant.
 

Comment, dans le testeur, un 4108 (ticket invalide) peut-il se produire lors d'une modification ? MQL4

if(OrdersTotal() > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
     {
      if(OrderType() == OP_BUY && SymbolInfoDouble(_Symbol,SYMBOL_BID) >= value_tp1 && !_tps) _tps = OrderClose(ticket,c_lot,SymbolInfoDouble(_Symbol,SYMBOL_BID),(int)slippage,clrNONE);
      if(OrderType() == OP_SELL && SymbolInfoDouble(_Symbol,SYMBOL_ASK) <= value_tp1 && !_tps) _tps = OrderClose(ticket,c_lot,SymbolInfoDouble(_Symbol,SYMBOL_ASK),(int)slippage,clrNONE);
      if(_tps && !sl_mod) sl_mod = OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,clrNONE);
     };


 
Alexandr Sokolov:

Comment, dans le testeur, un 4108 (ticket invalide) peut-il se produire lors d'une modification ? MQL4


il est fort probable que vous essayez de clôturer un ordre qui figure déjà dans l'historique, c'est-à-dire un ordre déjà clôturé.

consultez le fichier d'aide SELECT_BY_TICKET, il effectue cette opération indépendamment du fait que l'ordre soit déjà ouvert ou dans l'historique des ordres.

SZZY : faire une vérification pour OrderCloseTime()

 
Igor Makanu:

vous essayez très probablement de clôturer un ordre qui figure déjà dans l'historique, c'est-à-dire un ordre déjà clôturé.

Consultez le fichier d'aide SELECT_BY_TICKET. Il effectue cette opération indépendamment du fait que l'ordre soit déjà ouvert ou dans l'historique des ordres.

SZY : vérifier OrderCloseTime()

Je pense qu'il est dit que sélectionner dans le marché

OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)
OrderSelect - Trade Functions - MQL4 Reference
OrderSelect - Trade Functions - MQL4 Reference
  • docs.mql4.com
To find out from what list the order has been selected, its close time must be analyzed. If the order close time equals to 0, the order is open or pending and taken from the terminal open orders list. One can distinguish an opened order from a pending order by the order type. If the order close time does not equal to 0, the order is a closed...
 
Vitaly Muzichenko:

Je pense que ça dit de choisir celui qui est sur le marché.

Je ne pensais pas avoir à vous citer pour la documentation...

Note

Le paramètre pool est ignoré si la commande est sélectionnée à l'aide du numéro de ticket. Le numéro de billet est l'identifiant unique de la commande.

Pour déterminer dans quelle liste un ordre est sélectionné, nous devons analyser son heure de clôture. Si l'heure de clôture de l'ordre est 0, alors l'ordre est ouvert ou en attente et est pris dans la liste des ordres ouverts du terminal.