Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 887

 
tuner:
fazer início nulo() e não haverá erro
Obrigado! O erro desapareceu, mas a posição ainda não fecha.
 
rapid_minus:
Obrigado! O erro desapareceu, mas a posição ainda não fecha.
Não há código suficiente para dizer exatamente o que está causando isso
 
tuner:
Não há código suficiente para dizer exatamente qual é a razão


Extrato:

void CritCloseBuy()
{
if (((Yellow_0-Red_0)<(Yellow_1-Red_1) && ((MA_0<MA_1)&&(MA_1>MA_2))) ||| ((Yellow_0-Red_0)>(Yellow_1-Red_1)&& ((MB_0<MB_1)&&(MB_1>MB_2))))
while(true)
{
ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red);
if (ord_close = false)
{
Comentário(" BAYposition closing failed with error #",GetLastError()));//Mensagem do erro
pausa;
}
senão
{
Ord=0;
pausa;
}

}

Pode ser a razão para a abertura:

Critérios nulosOpen()
{
se (///condição de abertura///)

enquanto (true)
{
ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,0,0,NULL,10011,0,clrNONE); // pedido aberto BAY, MAGIC 10011
if(ticket<=0)
{
Comentário("Abertura da posição BAY-10011 falhou com erro #",GetLastError());

pausa;
}
mais
{
Comentário("BAY-10011 posição aberta com lote 0.1,preço", Ask);
Ord=(Ord+1);
pausa;
}
}

 
rapid_minus:


Extrato:


...

antes ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red);

seria bom selecionar a ordem usando a função OrderSelect(). Não vejo o propósito de tal laço em torno da função de fechamento.

 
evillive:

antes ord_close=OrderClose(OrderTicket(),0.1,MarketInfo(OrderSymbol(),MODE_BID),0,Red);

seria bom selecionar a ordem usando a função OrderSelect().

Eu tenho o único. Bem, na verdade foi assim no início. Comecei a procurar a causa usando o método de apalpação. Eu não entendo o sentido do laço.

Eu só faço batota por analogia: se eu abria com loop, então eu deveria fechar também...

 

Igor Kim tem nosso exemplo:

início vazio() {
ManagePositions();
}

//+
+ //| Fechar posições a preço de mercado|
//| Parâmetros:|
//| sym - nome do instrumento ("" - símbolo atual)|
//| op - operação(-1 - qualquer posição)|
//| mn - MagicNumber(-1 - qualquer magik) |
//+
+
void ClosePositions(string sym="", int op=-1, int mn=-1) { int i, k=OrdersTotal();

if (sym=="") sym=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sym && (op<0 || OrderType()==op)) {
if (mn<0 || OrderMagicNumber()==mn) {
if (OrderType()==OP_BUY) {
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, closeCloseBuy);
}
if (OrderType()==OP_SELL) {
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, closeCloseSell);
}
}
}
}
}
} }

Mas o compilador requer a verificação do valor de retorno do OrderClose

 
rapid_minus:

Igor Kim tem nosso exemplo:


Mas o compilador requer que o valor de retorno OrderClose seja verificado

Bem, faça-o como no exemplo - primeiro selecione e depois feche. Não importa se é a única ordem ou um milhão de ordens, pois cada ordem deve ser selecionada primeiro.

A verificação é muito simples se(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, closeCloseSell)) Imprimir("Erro de fechamento #", GetLastError());

 
rapid_minus:

Igor Kim tem o nosso como exemplo:

...

Mas o compilador requer que o valor de retorno OrderClose seja verificado

Isso porque na época em que Igor escreveu suas funções, o compilador não precisava verificar o valor de retorno, enquanto o compilador de hoje jura que se não o fizer
 
evillive:

Faça o mesmo que no exemplo - selecione primeiro e depois feche. Não importa se há apenas um pedido ou um milhão de pedidos, cada um tem que ser selecionado primeiro.

A verificação é muito simples se(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, closeCloseSell)) Imprimir("Erro de fechamento #", GetLastError());

Eu fiz o seguinte: se (!OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red))
{
Comentário("O fechamento da posição BAY falhou com erro #",GetLastError()));
pausa;
}
senão
{
Ord=0;
pausa;
}

Continua exigindo "o valor de retorno deve ser verificado .

Fez com que fosse assim:

ord_close=OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);
if (ord_close = false)
{
Comentário ("BAY position closing failed with error #",GetLastError()); //Mensagem de erro
pausa;
}
mais
{
Ord=0;
pausa;
}

Silencioso. Mas em ambos os casos, não fecha a posição

ZS: Eu acho que há um erro na definição de condições próximas e abertas

O posto acima mostra um exemplo de uma condição próxima. O que poderia estar errado aí?

 
rapid_minus:

É silencioso. Mas em ambos os casos, não fecha a posição

ZS: Acho que há um erro na definição das condições de fechamento e abertura de posições

No posto acima, há um exemplo de uma condição próxima. O que poderia estar errado aí?

Bem, se silenciosamente, sem erros, não fecha, então a condição de fechamento não é correta. Precisamos repensar e reescrever esta mesma condição.

Os parênteses aqui estão, de alguma forma, mal arranjados:

if (((Yellow_0-Red_0)<(Yellow_1-Red_1) && ((MA_0<MA_1)&&(MA_1>MA_2))) || ((Yellow_0-Red_0)>(Yellow_1-Red_1) && ((MB_0<MB_1)&&(MB_1>MB_2))))

Que tal isso?

if (((Yellow_0-Red_0<Yellow_1-Red_1) && (MA_0<MA_1 && MA_1>MA_2)) || ((Yellow_0-Red_0>Yellow_1-Red_1) && (MB_0<MB_1 && MB_1>MB_2)))