Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1203

 
Alexey Belyakov:

Desta forma? Ou eu preciso declarar algo mais no OnInit?

Não,todas as linhas no OnInitestão ocultas por padrão:

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:

Não,todas as linhas estão ocultas por padrão noOnInit:

A condição é ignorada por algum motivo. Mesmo que eu defina uma abertura de posição.

A variável PRL não pode ser arrancada e colocada em condições.


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());     // если отправить запрос не удалось, вывести код ошибки

Estou tentando tirar isso de alguma forma com a GlobalVariableGet . Mas, de alguma forma, é duvidoso...

Mesmo quando eu o coloco dentro da condição. O preço mínimo já está definido. Mas ainda se recusa teimosamente a abrir a posição.


//+------------------------------------------------------------------+
//|                                                  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:

A condição é ignorada por algum motivo. Mesmo que eu defina uma abertura de posição.

A variável PRL não pode ser arrancada e colocada em condições.


PRL, você tem Baixo na compensação 1
PRL = iLow(NULL, PERIOD_CURRENT, 1);
PRH, isto é alto em offset 1
PRH = iHigh(NULL, PERIOD_CURRENT, 1);

Temos a seguinte imagem:

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

Portanto, ao invés dePRL você pode tomar iLow(NULL, PERIOD_CURRENT, 1) ou l1.

Tenho a impressão de que você não está interessado em escrever código e não entende o que está fazendo. Um pouco de paciência e você pode facilmente descobrir tudo isso. Limpe seu código e muitas perguntas desaparecerão por conta própria. Se você não consegue descobrir o que deu errado, há também a depuração, é uma ferramenta muito poderosa de um programador. Chegue ao fundo do que está fazendo e depois faça perguntas.

 
Alexey Belyakov:

A condição é ignorada por algum motivo. Mesmo que eu defina uma abertura de posição.

O PRL variável não pode ser arrancado e colocado em condições.


Estou tentando tirar isso de alguma forma com a GlobalVariableGet . Mas, de alguma forma, é duvidoso...

Mesmo quando eu o coloco dentro da condição. O preço mínimo já está definido. Eu ainda não quero abrir uma posição.


Então, por que eu tenho que escrever uma mensagem primeiro e depois editá-la?

 
Alexey Belyakov:

A condição é ignorada por algum motivo. Mesmo que eu defina uma abertura de posição.

O PRL variável não pode ser arrancado e colocado em condições.


Estou tentando tirar isso de alguma forma com a GlobalVariableGet . Mas, de alguma forma, é duvidoso...

Mesmo quando eu o coloco dentro da condição. O preço mínimo já está definido. Eu ainda não quero abrir uma posição.


O algoritmo em seu código estava originalmente errado, assim como o algoritmo de entrada no mercado. Eu corrigi isso.

//+------------------------------------------------------------------+
//|                                                  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());     // если отправить запрос не удалось, вывести код ошибки

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

Mas este código precisará de muitas revisões para poder usá-lo em comércio real...

 
Mihail Matkovskij:

Em seu código, o próprio algoritmo estava originalmente errado, assim como o algoritmo para entrar no mercado. Corrigido.

Mas para usar este código em comércio real você precisará de muitas revisões...

Muito legal! Obrigado! Olhando aqui ao mesmo tempo, e o problema das entradas múltiplas é resolvido. Está funcionando como deveria agora.
 

Como, no testador, um 4108 (bilhete inválido) pode ocorrer durante uma modificação? 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:

Como, no testador, um 4108 (bilhete inválido) pode ocorrer durante uma modificação? MQL4


muito provavelmente você está tentando fechar uma ordem que já está na história, ou seja, uma ordem já fechada

veja no arquivo de ajuda SELECT_BY_TICKET, ele faz isso independentemente de o pedido já estar aberto ou no histórico do pedido

SZZY: faça uma verificação para OrderCloseTime()

 
Igor Makanu:

você está muito provavelmente tentando fechar uma ordem que já está na história, ou seja, uma ordem já fechada

olhe através do arquivo de ajuda SELECT_BY_TICKET. Ele faz isso independentemente de o pedido já estar aberto ou no histórico do pedido

SZY: verificar OrderCloseTime()

Acho que diz para selecionar qual deles está no mercado

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:

Acho que isso diz respeito a escolher qual deles está no mercado.

Não pensei que teria que citá-lo na documentação...

Nota

O pool de opções é ignorado se o pedido for selecionado usando o número do bilhete. O número do bilhete é o identificador único para o pedido.

Para determinar a partir de qual lista um pedido é selecionado, devemos analisar sua hora de encerramento. Se o tempo de fechamento do pedido for 0, então o pedido está aberto ou pendente e é retirado da lista de pedidos abertos do terminal.