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

 
PapaYozh:


Não, não é. Ficou ainda pior :)

Entenda, RefreshRates() atualiza os valores das variáveis Ask e Bid pré-definidas, você está usando o valor uma vez armazenado na variável Price.


Entendi :-) Pensei que o Price só era acessado quando a execução nesta função chega à OrderSend

 int OpenPosition(string AdvisorName,int Position,int Magic,double Lots,double StopLoss){ 
 int N; int Сount = 5; int Slippage = (CalculateSpread() * 2); double Price;
 string PeriodString = GetPeriod(Period());
 if(Position == OP_BUY){
 string OrderName = StringConcatenate(AdvisorName," - Покупка по рынку");
 string ErrorName = "Ошибка открытия ордера на покупку";
 string CriticalErrorName = "Невозможно открыть ордер на покупку";
 string MailCriticalErrorName = "Ошибка открытия"; color Arrow = Gold;}
 if(Position == OP_SELL){
 OrderName = StringConcatenate(AdvisorName," - Продажа по рынку"); ErrorName = "Ошибка открытия ордера на продажу";
 CriticalErrorName = "Невозможно открыть ордер на продажу";
 MailCriticalErrorName = "Ошибка открытия"; Arrow = YellowGreen;}
 
 while(IsTradeContextBusy() || !IsTradeAllowed()){int Interval = MathRand()+1000; 
 Print("Торговый поток занят. Повторная проверка через "+DoubleToStr((Interval/1000),0)+" сек"); 
 Sleep(Interval);} while(N < Сount){
 if(Position == OP_BUY){RefreshRates(); Price = NormalizeDouble(Ask,Digits);}
 if(Position == OP_SELL){RefreshRates(); Price = NormalizeDouble(Bid,Digits);}
 int Ticket = OrderSend(Symbol(),Position,Lots,Price,Slippage,StopLoss,0,OrderName,Magic,0,Arrow);
 if(Ticket > 0){if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)){int Flag = 1; 
 PlaySound("recharge.wav"); break;}}
 else{Flag = 0; int PRM = GetLastError(); string ERR = Error(PRM,"OrderSend()"); 
 ErrorProcessing(AdvisorName+" "+PeriodString,ErrorName+" "+PRM+" ("+
 Error(PRM,"OrderSend()")+")","","OrderSend()"); N++; Sleep(5000);}
 if(N == Сount){ErrorProcessing(AdvisorName+" "+PeriodString,CriticalErrorName,
 MailCriticalErrorName+" "+PRM+" ("+Error(PRM,"OrderSend()")+")","OrderSend()");}}
 return(Flag);}
Parece ser agora mesmo, não é mesmo?))
 
Dimoncheg:


Entendido:-) Pensei que o Price só era acessado quando a execução nesta função chega à OrderSend

Parece ser agora mesmo, não é mesmo?)


Eu acho que sim.
 
int BlackOrWhite(int countbar)
{
int result_=0;
 
if (iClose(NULL,0,countbar)-iOpen(NULL,0,countbar))
result_=1;
else
result_=-1;
 
if (iOpen(NULL,0,countbar)==iClose(NULL,0,countbar))
result_=0;
 
return(result_);
}

valor, dá apenas um valor por alguma razão + o compilador jura :

'iClose' - expressão de comparação esperada

Eu não entendo o que está errado.

if(BlackOrWhite(1)>0)
      {
portanto, use-o no programa.
 
nuan:

dá apenas um valor, por alguma razão + o compilador se afasta:

'iClose' - expressão de comparação esperada

Eu não entendo o que está errado.

É assim que eu o utilizo em minha aplicação.



if (iClose(NULL,0,countbar)-iOpen(NULL,0,countbar)>0)
   result_=1;
else
   result_=-1;

Ou é assim

if (iClose(NULL,0,countbar)>iOpen(NULL,0,countbar))
   result_=1;
else
   result_=-1;
 
PapaYozh:

Eu acho que sim.

Tudo parece estar funcionando, obrigado.
 
Muito obrigado.
 

Hi. Preciso de alguma ajuda. A questão é esta:

Uma vez que uma ordem tenha sido acionada, não importa como todas as outras ordens precisam ser fechadas. E mais uma vez pela condição devem abrir-se novas.

 
sergey_r:

Hi. Preciso de alguma ajuda. A questão é esta:

Após uma ordem ter sido acionada, não importa como todas as outras ordens precisam ser fechadas. E mais uma vez pela condição devem abrir-se novas.


Você já leu o livro didático neste momento?
 

Eu usei até agora

ordem de bool estático_aberto = falso;

if(order_opened){return(0);}

OrderSend(Symbol(),OP_BUYLIMIT,0.1,cena_buy,3,sl_buy,tp_buy,"",14774,0,Blue);
Alerta (GetLastError()); // Mensagem de erro na colocação do pedido
order_opened = true; // se o pedido funcionou, não abra novamente

Agora só precisamos abrir um novo pedido depois que o pedido tiver funcionado.


 
sergey_r:

Eu usei até agora

ordem de bool estático_aberto = falso;

if(order_opened){return(0);}

OrderSend(Symbol(),OP_BUYLIMIT,0.1,cena_buy,3,sl_buy,tp_buy,"",14774,0,Blue);
Alerta (GetLastError()); // Mensagem de erro na colocação do pedido
order_opened = true; // se o pedido funcionou, não abra novamente

Agora só precisamos abrir um novo pedido depois que o pedido tiver funcionado.



Leia o tutorial e a documentação, altere a lógica de abertura, fechamento por condição de pose, insira o código via CTRL+ALT+M.