Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 69
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Por exemplo, aqui https://docs.mql4.com/ru/basis/preprosessor/compilation
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 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.
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.
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 fluxo2017.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, 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
{
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.
Nós temos esse tipo de merda.
{
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?
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;