Características da linguagem mql4, sutilezas e técnicas - página 2

 
Sinta-se livre para devolver GetPointer(isto) dos métodos.

Pelo menos nos ajustadores de métodos isto se justifica - o código pode se tornar mais legível e compacto, você recebe um la nominativo de parâmetros

ChartObject *hline=HLine::New(1.255).Color(clrGreen).Width(2).Selectable(true); // не надо помнить очерёдность параметров и можно писать в одну строку - цепочкой

// получается вот из подобного :
class HLine:public ChartObject {
public:
   HLine(double price);
   HLine *New(double _price) { return new HLine(_price); } // это чтобы не городить (new HLine(...)).Method1
   HLine *Color(color _clr) { fgColor=_clr; return GetPointer(this); }  // а это чтобы получались цепочки obj.Method1(..).Method2(..)
};
É claro, use com cautela, pois não há exceções no idioma e não são esperadas

e interfere um pouco na qualificação das funções pelo tipo retornado.
 
Maxim Kuznetsov:
Sinta-se livre para devolver GetPointer(isto) dos métodos.
Desta forma , isto é mais conciso.
 
fxsaber:
Desta forma , isto é mais conciso.
E GetPointer() pode ser cuidadosamente anulado, por exemplo, para fins de depuração.
 
Um ponteiro tirado pela GetPointer não pode ser apagado, qual é o objetivo disso?
 
// После этого в MQL4 будут компилироваться все библиотеки из MQL5\Include\Math
#property strict

#ifdef __MQL4__
  #include <Math\Alglib\bitconvert.mqh>  
  
  #define  TEMP_MACROS(A) double A( double ) { return(0); }
    TEMP_MACROS(MathLog1p)
    TEMP_MACROS(MathExpm1)
    TEMP_MACROS(MathArcsinh)
    TEMP_MACROS(MathArccosh)
    TEMP_MACROS(MathArctanh)
  #undef  TEMP_MACROS
#endif
 
Alexey Viktorov:
Bem, deixe-me começar primeiro.

Para fechar um pedido, não é necessário definir o tipo de pedido e o preço que corresponde a este tipo. Basta escrever "fechar a preço" em OrderClosePrice()!

/********************Script program start function********************/
void OnStart()
{
   int i, total = OrdersTotal()-1;
    for(i = total; i >= 0; i--)
     {
      if(OrderType() < OP_SELLSTOP)
       {
        if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100))
        printf("***********");
       }
     }
}/********************************************************************/


Bastante legal! ) Obrigado.

Julgando pelo exemplo, você também não precisa da OrderSelect()?

 
Liza_:


(Legal! ) Obrigado.

Julgando pelo exemplo, OrderSelect() também não é necessário?

Sim, é. Alexey acabou de perdê-lo...
 
Liza_:

Legal! ) Obrigado.

Sim, ele permite escrever roteiros bastante concisos para uso em combate
// Закрывает позиции, описание - https://www.mql5.com/ru/code/17943
sinput int RTOTAL = 4;            // Число повторов при неудачных сделках
sinput int SLEEPTIME = 1;         // Время паузы между повторами в секундах
sinput int Deviation_ = 10;       // Отклонение цены
sinput bool exAllSymbols = false; // false - только текущий, true - все символы

#define _CS(A) ((!IsStopped()) && (A))

bool CloseAllPositions( const bool AllSymbols = true, const int Slippage = 0 )
{
  bool Res = true;
  
  for (int i = OrdersTotal() - 1; _CS(i >= 0); i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) &&
        (AllSymbols ? true : (OrderSymbol() == Symbol())))
      Res &= OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage);
      
  return(Res);
}

void OnStart()
{
  for (int i = 0; _CS((i < RTOTAL) && (!CloseAllPositions(exAllSymbols, Deviation_))); i++)
    Sleep(SLEEPTIME * 1000);
}
A comparação com a MQL5-análogo não está a seu favor. Será que há situações em que o resultado da comparação é o oposto?
 
Artyom Trishkin:
Necessário. Só falhou por preguiça...

Sim, bem... Realmente confuso.

Mas antes, eu não me deparei com estes tópicos.

fxsaber:

Portanto, você pode usar OrderClosePrice somente DEPOIS do OrderSelect correspondente. Uma vez que OrderSelect copia uma vez os dados para Order(const)-functions, e o mesmo RefreshRates não é capaz de atualizá-los.

Isto é, se, por exemplo, o OrderClosePrice não fechar, então o OrderSelect deve ser feito novamente antes da próxima tentativa (não é necessário fazer uma atualização).

ZS Esta linha é de 2005! Há argumentos detalhados dos desenvolvedores aqui.

Assim você pode usá-lo, mas com o entendimento de que pode haver problemas.
 

As ordens abertas devem ser analisadas a partir de um número maior, ou seja, for(int nom=OrdensTotal()-1; nom>=0; nom--)
Isto é especialmente importante quando se trata de eliminar pedidos.
Mas o que acontecerá se fizermos o contrário para(int nom=0; nom<OrdersTotal(); nom++) ?
No início, o índice é igual a zero e a primeira ordem com o número 0 é eliminada.
Então o índice se torna igual a 1. Neste ponto, as ordens restantes são deslocadas e aquela com o número 1
ocupa a posição zero. O antigo número 2 toma a posição 1. Será apagado.
Então o índice passa a ser 2. E a ordem que era a número 4 no início será apagada.
Assim, as ordens que ocupam posições de número par no início são eliminadas. As de número ímpar permanecerão. Isto pode ser visto nos comentários aos pedidos e números.
Eu anexei um script mostrando as opções de exclusão e capturas de tela
Há 20 ordens pendentes

Eliminado um a um

Arquivos anexados:
PROBA-ORD.mq4  3 kb