Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 69

 
Alexey Viktorov:
Por exemplo, aqui https://docs.mql4.com/ru/basis/preprosessor/compilation
Obrigado!
 
trader781:

No exemplo atual, quero poder colocar um número infinito de pedidos com qualquer lote para não exceder seus limites.

É claro que todos conhecemos os limites, mas eu quero fazer desta maneira

Procedo do fato de que se você especificar um elemento entre parênteses, ele será o último

Então eu tenho esse tipo de porcaria. Estava esperando uma ordem por ordem... lote? quero que o resultado (lote de um pedido *coeficiente) seja adicionado ao pedido em vez do lote

e a questão da recuperação de dados de lá

Quero obter o seguinte resultado, a meu ver

MyArray[0][0.01][0.01

MyArray[1][0.01]

MyArray[2][0.02]

etc....

Então, qual é a pergunta real?

Você escreveu uma matriz com lotes, depois ordena-a por tamanho de lote, ela ordenará por números de abertura, porque no seu caso, cada posição seguinte abre com um lote maior

double BPosMass[];
double SPosMass[];

void OnTick()
{
// Заполняем массивы
int b=-1,s=-1; // Объявим переменные с минусом
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic || Magic<0)) {
     if(OrderType()==OP_BUY) {
      b++;
       ArrayResize(BPosMass,b+1);
       BPosMass[b]= OrderLot();
     }
     if(OrderType()==OP_SELL) {
      s++;
       ArrayResize(SPosMass,s+1);
       SPosMass[s]= OrderLot();
     }
  }}} // конец записи массив

// Читаем отсортированный массив с лотами
// Buy
  if(b>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
    ArraySort(BPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по размеру лота
    // Работа с полученными данными
    Comment("Самый старый Buy лот: ",    BPosMass[0],
            "\nПоследний Buy лот: ",     BPosMass[b],
            "\nПредпоследний Buy лот: ", BPosMass[b-1]
           );

  } // end Buy

// Sell
  if(s>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
    ArraySort(SPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по размеру лота
    // Работа с полученными данными
    Comment("Самый старый Sell лот: ",    SPosMass[0],
            "\nПоследний Sell лот: ",     SPosMass[s],
            "\nПредпоследний Sell лот: ", SPosMass[s-1]
           );

  } // end Sell
  
// Конец функции OnTick()
}


Em seguida, aplique da seguinte forma: conte o número total de posições e, se menos de três, então não acesse o array, se mais, então leia o array e tire dados do mesmo.

A saída da matriz não é no momento da escrita, mas no momento da leitura.

 
Vitaly Muzichenko:


A saída da matriz não ocorre no momento da escrita, mas no momento da leitura.

Não. No momento de acessar um índice de matriz inexistente.
 
Vitalie Postolache:
Não. No momento de acessar um índice de matriz inexistente.
Então, o que eu escrevi?
 
Vitaly Muzichenko:
Então, o que escrevi?

2017.01.1312:51:14.3722017.01.0516:30:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.02
2017.01.1312:51:14.3722017.01.0516:25:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.01

As ordens de contagem são constantes e o lote muda. Não deveria ser assim, mas não funciona de outra forma

Idealmente, a entradaMyArray[CountOrders][OrderLots()]

assim a saída seriaMyArray[0][0.01]MyArray[1][0.01]

mas isso não vai funcionar em µl.

e depois, de alguma forma, extrai-la da função para o fluxo
 
trader781:

2017.01.1312:51:14.3722017.01.0516:30:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.02
2017.01.1312:51:14.3722017.01.0516:25:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.01

As ordens de contagem são constantes e o lote muda. Não deveria ser assim, mas não funciona de outra forma

Idealmente, a entradaMyArray[CountOrders][OrderLots()]

assim a saída seriaMyArray[0][0.01]MyArray[1][0.01]

Mas isso não funciona em µl

As estruturas o ajudarão. Você cria uma estrutura com campos necessários, declara um conjunto de tais estruturas, preenche-a com dados de ordem no laço abrindo o tempo, e depois procura por tudo o que você precisa. Verifique os campos da estrutura pelo índice e compare-os com o valor necessário. O índice indicará o número do pedido por seu tempo de abertura, e todos os dados necessários sobre esta ordem específica serão mostrados nos campos da estrutura.
 
Artyom Trishkin:
As estruturas o ajudarão. Você cria uma estrutura com campos necessários, declara um conjunto de tais estruturas, preenche-a com dados de ordem no laço abrindo o tempo e, em seguida, busca tudo o que você precisa nela. Verifique os campos da estrutura pelo índice e compare-os com o valor necessário. O índice apontará para o número do pedido por seu tempo aberto, e todos os dados necessários sobre esta ordem específica serão fornecidos nos campos da estrutura.

Este é o tipo de merda que nós temos

struct myorder
{
int    Ticket;
double orderopenprice;
int   ordertype;
double profit;
double stoploss;
double  lot;
};

myorder orders[];

int i;
void CalcOrders()
{
for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
         && (OrderMagicNumber()==Magic) && (OrderType()<2))
         orders[i].Ticket=OrderTicket();
         orders[i].lot=OrderLots();
         orders[i].orderopenprice=OrderOpenPrice();
         orders[i].ordertype=OrderType();
         orders[i].profit=OrderProfit();
         orders[i].stoploss=OrderStopLoss();
     }
}    


Quero tirar, por exemplo, o lote 5 de um pedido e compará-lo com o lote 3

somar o preço de abertura e dividir pelo número de posições

precisamos de uma entrada de comando para este tipo de coisa.

 
trader781:

Nós temos esse tipo de merda.

struct myorder
{
int    Ticket;
double orderopenprice;
int   ordertype;
double profit;
double stoploss;
double  lot;
};

myorder orders[];

int i;
void CalcOrders()
{
for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
         && (OrderMagicNumber()==Magic) && (OrderType()<2))
         orders[i].Ticket=OrderTicket();
         orders[i].lot=OrderLots();
         orders[i].orderopenprice=OrderOpenPrice();
         orders[i].ordertype=OrderType();
         orders[i].profit=OrderProfit();
         orders[i].stoploss=OrderStopLoss();
     }
}    


Quero tirar, por exemplo, o lote 5 de um pedido e compará-lo com o lote 3

somar o preço de abertura e dividir pelo número de posições

Preciso de uma entrada própria na forma de comandos para este tipo de coisa

Como o índice de laço i se refere a qualquer ordem, não apenas àquelas que você precisa, você deve declarar uma variável (por exemplo, n=0;) na função que estará a cargo do tamanho da matriz. Após passar as verificações, aumentar o valor desta variável dentro do laço, aumentar o tamanho da matriz pelo valor desta variável e preencher os campos da estrutura de acordo com o índice n-1: ordens[n-1].xxx=XXX;

 

Por favor, diga-me porque a função OrdersTotal() escreverá -1 ao procurar por pedidos.

Exemplo: para (i=OrdensTotal()-1 ;i>=0; i--)

por que não apenas OrdensTotal()?

A contagem dos pedidos nesta função começa a partir de 0 ou 1? Isto é, se houver uma ordem, a ordemTotal() é igual a 0 ou 1?

 
Artyom Trishkin:

Como o índice de loop i se refere a qualquer ordem, não apenas àquelas que você precisa, você deve declarar uma variável (por exemplo, n=0;) na função que será responsável pelo tamanho da matriz. Após passar as verificações, aumentar o valor desta variável dentro do laço, aumentar o tamanho da matriz pelo valor desta variável e preencher os campos da estrutura pelo índice n-1: ordens[n-1].xxx=XXX;

Já que temos um pacote de pedidos, por que não podemos simplesmente retirar o pedido correto? (os necessários) e fazer o que queremos fazer com eles? por exemplo, pedir (i-4)
Razão: