Erros, bugs, perguntas - página 803

 
Karlson:
Diferentes servidores, diferentes 500 pp.
O que é que isto tem a ver com diferentes servidores? Estes são dois testes realizados pela mesma pessoa. Apenas o par de moedas especificado no testador difere
 
ilunga:
O que é que isto tem a ver com diferentes servidores? Estes são dois testes realizados pela mesma pessoa. Apenas o par de moedas especificado no testador difere
Actualize o seu terminal/tester e talvez tudo funcione, tenho o 687 construído e tudo funciona.
 
fyords:

Tenho tudo correcto, servidor MK de demonstração.

Depois, por favor explique, qual é o valor entre parênteses quando abre uma encomenda e porquê num caso é (1.29565 / 1.29654) e no outro (1.29443 / 1.29479 / 1.29443)

(Refiro-me aos resultados dos seus testes.

fyords:
Actualize o seu terminal/tester e talvez tudo funcione, tenho um 687 construído e tudo funciona.

Exactamente o mesmo erro "aparece" ao enviar a EA para o campeonato (nos seus testes automáticos), pelo que a actualização só ajudará parcialmente


E mais. Surge apenas 1 vez (a primeira tentativa de colocar uma encomenda num par de moedas que não seja "seu")

 
ilunga:
O que é que isto tem a ver com diferentes servidores? Estes são dois testes realizados pela mesma pessoa. Apenas o par de moedas especificado no testador difere.

Dê uma vista de olhos aos artigos sobre o provador:

Os preços não precisam de ser os mesmos quando se testa num outro par de moedas

 
Rosh:

Dê uma vista de olhos aos artigos sobre o provador:

Os preços não têm de corresponder quando testados noutro par de moedas

Por isso, efectuou mais alguns testes. Realmente um problema com o "preço actual".

Código:

#include <Trade\SymbolInfo.mqh>
#include <Trade\Trade.mqh>

CSymbolInfo       m_sym;
CTrade            m_trade;

double bar_info[2];
bool a;

int OnInit()
{
   SymbolSelect("EURUSD", true);
   SymbolSelect("GBPUSD", true);
   m_sym.Name("EURUSD");
   a = false;
   return(0);
}

void OnTick()
{
   if (a) return;
   a = true;
   m_sym.Refresh();
   m_sym.RefreshRates();
   CopyHigh("EURUSD", PERIOD_D1, 0, 2, bar_info);
   Print("Текущая цена Ask:" + DoubleToString(m_sym.Ask()));
   Print("Текущая цена Bid:" + DoubleToString(m_sym.Bid()));
   Print("Цена открытия:" + DoubleToString(bar_info[1] + 5000*_Point));
   BUY_pending("EURUSD");
   Print("Текущая цена Ask:" + DoubleToString(m_sym.Ask()));
   Print("Текущая цена Bid:" + DoubleToString(m_sym.Bid()));
}

uint BUY_pending(string symbol)
{
   CopyHigh(symbol, PERIOD_D1, 0, 2, bar_info);
   // готовим запрос
   MqlTradeRequest request = {0};
   ZeroMemory(request);
   request.action = TRADE_ACTION_PENDING;
   request.magic  = 0;
   request.symbol = symbol;
   request.volume = 1;
   request.price  = m_sym.Ask() + 1;
   request.sl     = 0;
   request.tp     = 0;
   request.deviation = 10;
   request.type   = ORDER_TYPE_BUY_STOP; 
   request.type_filling = ORDER_FILLING_FOK;
   MqlTradeResult result;
   OrderSend(request,result);
   Print(IntegerToString(result.retcode));
   return (result.retcode);
}

Nota, abro ao preço do símbolo Ask mais 1 (com uma margem enorme). Ao mesmo tempo, antes e depois de eu imprimir o actual Ask and Bid.


Resultados (ao testar em GBPUSD):

GR      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Ask:1.29241000
LH      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Bid:1.29220000
QL      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Цена открытия:1.34220000
GD      0       Trade   11:49:40        2012.01.02 09:00:00   buy stop 1.00 EURUSD at 2.29241 (1.29709 / 1.29722)
IG      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   10009
CP      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Ask:1.29241000
HG      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Bid:1.29220000

O preço 1,29241 é impresso antes e depois da encomenda ser colocada. Entretanto, entre parênteses (quando a encomenda é feita), o preço é 1,29722. COMO? Ou estou a obter o preço actual de forma incorrecta?


E em segundo lugar, se houve um erro com o preço, então porque é que o erro 10016 (pára)?

 
ilunga:

Mas o erro ainda existe no cutscene.

Para ser honesto, não compreendo bem como pode ser o erro 10016 no caso de não haver paragens

Não sei o que e como o está a fazer, o problema provavelmente está realmente no SL.

A minha versão funciona sem problemas. A chamada, no entanto, lançou o bloco de inicialização, para não se preocupar com as verificações (embora a presença da ordem antes de a definir valesse a pena verificar).

bool BUY_pending(string symbol,ENUM_TIMEFRAMES period,double volume,ulong magic = 0)
{
//----------------------------------------------------------------------------//
//Work variables
double price = 0, sl = 0, tp = 0; //Prices: Open, Sell stop, Take profit
int ResCopy = -1; //Result of copying the data into an array
int Dig     = 0;  //Digits

bool Result = true; //Returned importance
//----------------------------------------------------------------------------//

ResetLastError();

//Checking the signal to stopping the trading system
  if(IsStopped()) return(false);
//Preparation of structures
ZeroMemory(TradeRequest);
ZeroMemory(TradeResult);
ZeroMemory(CheckResult);
//Copying the data into an array
ResCopy = CopyHigh(symbol,period,0,2,bar_info);

  if(ResCopy==-1)return(false); 
//Calculations
Dig   = (int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);

price = NormalizeDouble(bar_info[1] + 500*_Point,Dig);
sl    = NormalizeDouble(price - 200*_Point,Dig);
tp    = NormalizeDouble(price + 1000*_Point,Dig);
//Preparation of request
TradeRequest.type_filling = ORDER_FILLING_FOK;
TradeRequest.action       = TRADE_ACTION_PENDING;
TradeRequest.type         = ORDER_TYPE_BUY_STOP; 
TradeRequest.deviation    = 10;
TradeRequest.symbol = symbol;
TradeRequest.magic  = magic;
TradeRequest.volume = volume;
TradeRequest.price  = price;
TradeRequest.sl     = sl;
TradeRequest.tp     = tp;
//Checking
Result = OrderCheck(TradeRequest,CheckResult);
  if((!Result)||(CheckResult.retcode!=0))return(false);
//OrderSend
Result = OrderSend(TradeRequest,TradeResult);
//Checking for presence of the errors
  if(_LastError!=0){Result = false;}
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}
Arquivos anexados:
 
Interesting:

Não sei o que ou como o está a fazer, o problema provavelmente é realmente com o SL.

A minha versão funciona sem problemas. A chamada é verdadeira, mas eu fiz a chamada para o bloco de inicialização, para não me preocupar com as verificações (embora a presença da ordem antes de a definir valesse a pena verificar).

Um pequeno pedido. Pode corrigir o código, de modo a que este produza o preço actual do símbolo antes da OrderSend?
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 
ilunga:
Um pequeno pedido. Pode ajustar o código de modo a que antes da OrderSend it produza o preço actual do instrumento sobre o qual abrimos?

Tente desta forma:

   MqlTradeResult result;
   if(!OrderSend(request,result))
     {
      PrintFormat("retcode=%d price=%G  Ask=%G  Bid=%G Comment=%s",
                  result.retcode,result.price,result.ask,result.bid,result.comment);
      //---
      PrintFormat("%s %s at %G Ask=%G  Bid=%G  ",
                  EnumToString(request.type),symbol,request.price,SymbolInfoDouble(symbol,SYMBOL_ASK),
                  SymbolInfoDouble(symbol,SYMBOL_BID));
      Print("------------");
     }
 
ilunga:
Pequeno pedido. Pode corrigir o código, que antes de OrderSend it deduz o preço actual sobre essa ferramenta em que abrimos?

Um spritzer de preço? Não vejo necessidade disso, pode acrescentar uma mensagem sobre o sucesso/falha do cheque e a definição da ordem.

Em princípio, pode fazê-lo você mesmo, não deve ser difícil (por ideia).

Rosh:

Tente desta forma:

Para a depuração, será bastante bom, em código de trabalho será supérfluo (pelo menos um pouco de uma solução difícil)

E é melhor colocar ordem após OrderCheck, para que em caso de erro não vá para OrderSend.

PS

Esqueci-me de acrescentar, com base no exemplo bar_info poderia ser colocado numa função sem problemas.

 
Interesting:

Um spritzer de preço? Não vejo necessidade disso, pode acrescentar uma mensagem sobre o sucesso/falha do cheque e a definição da ordem.

Em princípio, pode fazê-lo você mesmo, não deve ser difícil (na ideia).

Pode ser suficientemente bom para depuração, mas em código de produção será supérfluo (pelo menos é uma solução um pouco tortuosa).

E seria melhor colocar a encomenda após OrderCheck, para que em caso de erro não cheguemos a OrderSend.

PS

Esqueci-me de acrescentar, com base no exemplo bar_info também poderia ser colocado numa função sem qualquer problema.

É engraçado. No vosso exemplo, eu removi o BUYSTOP por GBP, resta apenas EURUSD.

Depois de preencher os campos no pedido, produzi o preço da encomenda pendente.

1) Tem variante - a ordem pendente é colocada na iniciativa

2012.01.01.01 00:00:00 preço = 1.30487000

2) Comentei o init, mudei-o para OnTick. Coloco uma condição para disparar apenas no primeiro tique.

2012.01.02 09:00:00 preço = 1.29720000


P.S. Compreendo correctamente que no meu (e no seu) código bar_info[1] é o máximo da barra actual?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
Razão: