fez um 2 EMA cross EA, precisa de aconselhamento - página 4

 
prupru:

Tenho um problema maior agora, meu corretor tende a executar parcialmente as ordens.

Prezado cliente,

Informamos que seu comércio foi aberto parcialmente (2,32 lotes em 15,84) ao preço de 587.318.

Caso você tenha alguma dúvida adicional sobre este assunto, não hesite em nos contatar.

Cordiais cumprimentos,

Corretor.

aqui está o que diz o apoio:

Favor ser avisado, durante períodos de alta volatilidade ou baixa liquidez, Ordens Limitadas podem ser parcialmente executadas. Isto significa que a posição será preenchida imediatamente, total ou parcialmente, se o preço for cumprido. No caso de sua ordem ter sido executada parcialmente, é por isso que você recebeu uma carta de notificação.

Eu entendo como fechar todas as ordens apesar de serem fechadas parcialmente, eu só tenho que fechar todas as ordens enquanto OrdensTotal() > 0, mas ainda não sei o que fazer quando as ordens abrem parcialmente.

editar:

Acabei de perceber que tenho que verificar os pedidos com símbolos e números mágicos adequados, é um pouco mais difícil

editar: aqui está a função fechar todas as ordens que devem fechar as ordens mesmo com fechamento parcial


//Close all my Orders
void CloseAllOrders()
{
int notMyOrders = 0;

 while (OrdersTotal()>notMyOrders)
 {
 notMyOrders = 0;
 for(int i = OrdersTotal()-1; i >= 0 ; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
   if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) {notMyOrders++; continue;}
   if(OrderType()<= 1)CloseOrder();
         
   }
 }
return;
}  
reescrito
 
deVries:

reescrito


Uau!

Isso é um pouco complicado para mim, eu já li isso umas 4 ou 5 vezes antes de consegui-lo. Obrigado!

e... o que acontece se a OrderSelect retorna falsa?

Com que freqüência a OrderSelect retorna falsa? É mesmo possível?

 
prupru:


Uau!

Isso é um pouco complicado para mim, eu já li isso umas 4 ou 5 vezes antes de consegui-lo. Obrigado!

e... o que acontece se a OrderSelect retorna falsa?

Com que freqüência a OrderSelect retorna falsa? É mesmo possível?


for(int i = OrdersTotal()-1; i >= 0 ; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;

i= 0

volta do loop

i = -1

if(OrderSelect(-1,SELECT_BY_POS,MODE_TRADES)===falso) break; // ==> terminar a verificação de negócios nós quebramos o loop

próximo CloseOrder()

//CloseOrder
void CloseOrder()
{double PR=0;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(OrderType()==OP_BUY)  PR=Bid;
 if(OrderType()==OP_SELL) PR=Ask;
 if(!OrderClose(OrderTicket(),OrderLots(),PR,Slippage,CLR_NONE))
  {
   Print("Close order error: ",GetLastError());
   Print("Type ", OrderType()," PR ",PR, " Ask ", Ask, " Bid ", Bid, " OrderTicket ", OrderTicket(), " OrderLots ", OrderLots());
  }
return;}
//--------------------------- end of close order

o que os commonerrors podem ser devolvidos pela GetLastError()

se o fechamento falhar, pode ser que o próximo falhe também por um erro como um contexto comercial muito ocupado ou outro erro...

então o que você pode fazer para evitar muitas destas situações ??

 
deVries:


então o que você pode fazer para evitar muitas destas situações ??

ainda não sei. Tenho que pensar sobre isso.

Estou preso a outro problema neste momento.

Coloquei meu EA em um VPS Windows 2003 e agora ele está retornando com erro de "timeout", mas nunca vi tal erro em meu PC de casa.

E o erro aparece não no momento em que eu fecho e abro os ciclos de pedidos, mas quando o perito verifica a travessia e fica ocioso.

Quero dizer, o programa verifica a abertura de uma nova barra, trailingstop = 0 para que nenhuma chamada de função trailing stop, então se a nova barra for aberta, verifica a travessia EMA, não há travessia (as vezes em que recebi erros de timeout as linhas EMA estavam longe de atravessar), então o programa retorna(0)

Não há ciclos! Como pode ser encerrado com um timeout?

 
prupru:

ainda não sei. Tenho que pensar sobre isso.

Estou preso a outro problema neste momento.

Coloquei meu EA em um VPS Windows 2003 e agora ele está retornando com erro de "timeout", mas nunca vi tal erro em meu PC de casa.

E o erro aparece não no momento em que eu fecho e abro os ciclos de pedidos, mas quando o perito verifica a travessia e fica ocioso.

Quero dizer, o programa verifica a abertura de uma nova barra, trailingstop = 0 para que nenhuma chamada de função trailing stop, então se a nova barra for aberta, verifica a travessia EMA, não há travessia (as vezes em que recebi erros de timeout as linhas EMA estavam longe de atravessar), então o programa retorna(0)

Não há ciclos! Como pode ser encerrado com um timeout?


isto não é um ciclo ??

while(!IsTradeAllowed()) Sleep(10);
 
deVries:


isto não é um ciclo ??


Quero dizer, durante o tempo em que a EA terminou as linhas EMA estavam longe de cruzar, então uma função NewOrder não foi chamada, então o ciclo de que você está falando (que está dentro da função NewOrder) não foi executado.

adicionado Condição IsStopped

while( (!IsTradeAllowed()) && (!IsStopped()) ) Sleep(10);
while ( (LotRemains>0) && (!IsStopped()) )
while ( (OrdersTotal()>0) && (!IsStopped()) ) 
 
talvez o erro de timeout apareça porque eu fico sem recursos do processador VPS. Eu mudei para um plano mais dispendioso e não os vejo até que eu execute algo pesado como o uodato de janelas