Qual é o projeto correto? - página 5

 
valenok2003:

O resultado é este roteiro

Pergunta - Por que não fecha sempre todos os pedidos? Por exemplo, eu abro três ordens de Venda, uma após a outra, e tento fechá-las, mas o roteiro pode fechar uma ou duas ou todas elas. Qual é a razão?

Você precisa de um roteiro?

Então você não precisa de uma declaração , os scripts trabalham em loop como estão.

Para o roteiro você precisa desta construção...

Não me lembro do link, aqui está o roteiro que fecha todas as ordens abertas.

//+------------------------------------------------------------------+
//|                                               CloseAllOrders.mq4 |
//|                       Copyright © 2008, PRMQuotes Software Corp. |
//|                                           Jedimedic77@gmail.com  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, PRMQuotes Software Corp."
#property link      ""
//+------------------------------------------------------------------+
//| EX4 imports                                                      |
//+------------------------------------------------------------------+
#include <stdlib.mqh>
//+------------------------------------------------------------------+
//| global variables to program:                                     |
//+------------------------------------------------------------------+
double Price[2];
int    giSlippage;
bool   CloseOpenOrders = true;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void start() {
  int iOrders=OrdersTotal()-1, i;
  
  if(CloseOpenOrders) {
    for(i=iOrders; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderType()<=OP_SELL) && GetMarketInfo() && 
      !OrderClose(OrderTicket(),OrderLots(),Price[1-OrderType()],giSlippage)) Print(OrderError());
    }
  }
}
//+------------------------------------------------------------------+
//| Function..: OrderError                                           |
//+------------------------------------------------------------------+
string OrderError() {
  int iError=GetLastError();
  return(StringConcatenate("Order:",OrderTicket()," GetLastError()=",iError," ",ErrorDescription(iError)));
}
//+------------------------------------------------------------------+
//| Function..: GetMarketInfo                                        |
//+------------------------------------------------------------------+
bool GetMarketInfo() {
  RefreshRates();
  Price[0]=MarketInfo(OrderSymbol(),MODE_ASK);
  Price[1]=MarketInfo(OrderSymbol(),MODE_BID);
  double dPoint=MarketInfo(OrderSymbol(),MODE_POINT);
  if(dPoint==0) return(false);
  giSlippage=(Price[0]-Price[1])/dPoint;
  return(Price[0]>0.0 && Price[1]>0.0);
}
//+------------------------------------------------------------------+
 
valenok2003:

O resultado é este roteiro

Pergunta - Por que não fecha sempre todos os pedidos? Por exemplo, eu abro três ordens de venda seguidas, depois tento fechá-las com o roteiro, pode fechar uma ou duas ou todas elas. Qual é a razão?
E as citações são quantos dígitos?
 
khorosh:
E as citações são quantos dígitos?
cinco
 
Martingeil:

Você precisa de um roteiro?

Obrigado, é claro. Mas é fácil obter um roteiro pronto para uso. Quero descobrir qual é a razão.
 
Martingeil:

Você precisa de um roteiro?

então você não precisa da declaração while, os scripts trabalham em loop como está.


O roteiro só funciona uma vez. Lá não há auto-abrigo e nunca houve.

Valenok, você precisa do roteiro para fechar todos os pedidos, ou apenas este símbolo?

 
Martingeil:

Você precisa de um roteiro?

Então você não precisa da declaração de enquanto, os scripts trabalham em loop como está.

Para um roteiro você precisa desta construção...

Não me lembro do link, aqui está um roteiro que fecha todas as ordens abertas.

No código de enquanto , apenas para atrasar enquanto o fio está ocupado.
 
Techno:

o roteiro só funciona uma vez. Não há auto-accionamento e nunca houve.

Valenok, você quer que o roteiro feche todos os pedidos, ou apenas este símbolo?

Sim, você está certo errado, eu quis dizer que não depende dos carrapatos.
 
Techno:

o roteiro só funciona uma vez. Não há auto-accionamento e nunca houve.

Valenok, você precisa do roteiro para fechar todas as ordens, ou apenas este símbolo?



Apenas ordens abertas de um símbolo. Os pendentes não são afetados.

O engraçado é que o código criticado no kodobase

int start()
{
//----
  while(OrdersTotal()>0)
  {
    for (int i=0; i < OrdersTotal(); i++)                                                        
    {                                                                                          
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {
        OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5);  
      }
    }
  }                                               
//----
   return(0);
}

funciona sem nenhum problema, mas quando comecei a melhorá-lo, comecei a ter problemas.

zy:

Sobre a questão do cordel equivocado

for (int i=0; i < OrdersTotal(); i++)

Eu já descobri isso.

 
valenok2003:



Apenas ordens abertas de um símbolo. Não tocamos nos pendentes.

Então, vamos direto para os adiamentos e vamos tê-los. Na forma geral.

int start()
{
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
    if(OrderSelect(i,SELECT_BY_POS)&&OrderSymbol()==Symbol())
      switch(OrderType())
         {
         case 0  : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5); break;
         case 1  : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),5); break;
         default : OrderDelete(OrderTicket()); break;
         }
    }
        
}
 
Martingeil:
Tem razão, eu não quis dizer isso, independentemente dos tiques...


Estou ciente disso.