Sergey Gridnev #: Então, você tem um loop onde você muda o iterador i do índice máximo para 0. O que está acontecendo dentro dele? Bem, aqui está o que acontece: o primeiro comando que você tenta obter o parâmetro ORDER_SYMBOL. Mas, de qual ordem você está tentando obtê-lo, porque a ordem será selecionada três linhas abaixo!
Obrigado, Sergey, pela explicação muito detalhada e compreensível! Coloco a linha com o bilhete de pedido pendente logo após o início do ciclo e tudo funcionou bem.
Sim ... Preste atenção e preste atenção. Isso é o que realmente me falta. Mais uma vez, obrigado!
Hoje enfrentei mais duas questões que não entendo, mas em um código inteiramente retirado da Referência MQL5. Desta vez, eu mesmo não escrevi nada, mas apenas tomei um exemplo pronto.
Modify Pending Order
Торговый приказ на модификацию уровней цен отложенного ордера. Требуется указание 7 полей:
action
order
price
sl
tp
type_time
expiration
Пример торговой операции TRADE_ACTION_MODIFY для модификации уровней цен отложенного ордера:
Isto é claro. Sou seguido por um exemplo com este código:
#define EXPERT_MAGIC 123456// MagicNumber эксперта//+------------------------------------------------------------------+//| Модификация отложенных ордеров |//+------------------------------------------------------------------+voidOnStart()
{
//-- объявление и инициализация запроса и результатаMqlTradeRequest request={};
MqlTradeResult result={};
int total=OrdersTotal(); // количество установленных отложенных ордеров//--- перебор всех установленных отложенных ордеровfor(int i=0; i<total; i++)
{
//--- параметры ордераulong order_ticket=OrderGetTicket(i); // тикет ордераstring order_symbol=Symbol(); // символint digits=(int)SymbolInfoInteger(order_symbol,SYMBOL_DIGITS); // количество знаков после запятойulong magic=OrderGetInteger(ORDER_MAGIC); // MagicNumber ордераdouble volume=OrderGetDouble(ORDER_VOLUME_CURRENT); // текущий объем ордераdouble sl=OrderGetDouble(ORDER_SL); // текущий Stop Loss ордераdouble tp=OrderGetDouble(ORDER_TP); // текущий Take Profit ордераENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); // тип ордераint offset = 50; // отступ от текущей цены для установки ордера, в пунктахdouble price; // цена срабатывания ордераdouble point=SymbolInfoDouble(order_symbol,SYMBOL_POINT); // размер пункта//--- вывод информации об ордереPrintFormat("#%I64u %s %s %.2f %s sl: %s tp: %s [%I64d]",
order_ticket,
order_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),DoubleToString(sl,digits),
DoubleToString(tp,digits),
magic);
//--- если MagicNumber совпадает, Stop Loss и Take Profit не заданыif(magic==EXPERT_MAGIC && sl==0 && tp==0)
{
request.action=TRADE_ACTION_MODIFY; // тип торговой операции
request.order = OrderGetTicket(i); // тикет ордера
request.symbol =Symbol(); // символ
request.deviation=5; // допустимое отклонение от цены//--- установка уровня цены, тейк-профит и стоп-лосс ордера в зависимости от его типаif(type==ORDER_TYPE_BUY_LIMIT)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;
request.tp = NormalizeDouble(price+offset*point,digits);
request.sl = NormalizeDouble(price-offset*point,digits);
request.price =NormalizeDouble(price,digits); // нормализованная цена открытия
}
elseif(type==ORDER_TYPE_SELL_LIMIT)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point;
request.tp = NormalizeDouble(price-offset*point,digits);
request.sl = NormalizeDouble(price+offset*point,digits);
request.price =NormalizeDouble(price,digits); // нормализованная цена открытия
}
elseif(type==ORDER_TYPE_BUY_STOP)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point;
request.tp = NormalizeDouble(price+offset*point,digits);
request.sl = NormalizeDouble(price-offset*point,digits);
request.price =NormalizeDouble(price,digits); // нормализованная цена открытия
}
elseif(type==ORDER_TYPE_SELL_STOP)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point;
request.tp = NormalizeDouble(price-offset*point,digits);
request.sl = NormalizeDouble(price+offset*point,digits);
request.price =NormalizeDouble(price,digits); // нормализованная цена открытия
}
//--- отправка запросаif(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки//--- информация об операции PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
//--- обнуление значений запроса и результатаZeroMemory(request);
ZeroMemory(result);
}
}
}
//+------------------------------------------------------------------+
Estou tentando entender a linha destacada em amarelo. Uma pergunta surge imediatamente: O que oPositionGetDouble(POSITION_PRICE_OPEN) tem a ver com issose este exemplo estiver relacionado a pedidos pendentes? Talvez, deveria haver uma linha como esta:
Esta é a primeira coisa. A segunda questão surge quando eu tento executar este script em um gráfico com uma ordem pendente de BUY_STOP que eu defini (embora tudo semelhante aconteça com outros tipos de ordens pendentes). Então, o que acontece? Nada acontece! Não vejo nenhuma modificação de uma ordem pendente. Talvez, eu não entendo alguma coisa?
Sasha, você não pode pensar em nadapior do que usar exemplos da documentação ou exemplos de tumblr. E você também perdeu a bandeira de terminação forçada de enquanto loop em algum lugar. No total ... sem palavras.
Duvido que os exemplos escritos na documentação e até mesmo na biblioteca padrão sejam verificados minuciosamente. Há muitos erros desse tipo. Exemplos, em minha opinião, só podem ser usados como amostras...
Duvido que os exemplos escritos na documentação e até mesmo na biblioteca padrão sejam minuciosamente verificados. Existem muitos desses erros. Exemplos, em minha opinião, podem ser usados apenas como amostras
Olá Alexey!
É muito triste que uma empresa tão séria tenha uma atitude tão ruim em relação aos manuais.
É muito triste que uma empresa tão séria tenha uma atitude tão não séria em relação ao manual.
Atenciosamente, Vladimir.
Há outro erro neste exemplo. Ou completamente cego.
Entre os campos obrigatórios listados há uma expiração, mas no código do exemplo eu não vejo onde a expiração é atribuída. Ao invés disso, o desvio permitido do preço é atribuído.
Ainda há um erro neste exemplo. Ou talvez eu esteja completamente cego...
Entre os campos obrigatórios listados há a expiração, mas no exemplo de código não vejo onde a expiração é atribuída. Em vez disso, é especificado o desvio admissível do preço.
Não apenas o tempo de expiração, mas deve estar lá também:
Типы торговых операций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Obrigado pela dica, Alexey! Primeiro vou esperar por uma resposta neste tópico, mas se nada acontecer, então vou recorrer ao tópico Erros, Erros, Perguntas.
Atenciosamente, Vladimir.
Você não obterá nenhuma resposta dos desenvolvedores neste tópico. Se você encontrou um erro, certifique-se de que foi realmente um erro, relate-o ao setor manifestado por Alexey. Não há necessidade de esperar a ação dos moderadores sobre isto - também somos humanos, e às vezes também não temos tempo.
Então, você tem um loop onde você muda o iterador i do índice máximo para 0. O que está acontecendo dentro dele? Bem, aqui está o que acontece: o primeiro comando que você tenta obter o parâmetro ORDER_SYMBOL. Mas, de qual ordem você está tentando obtê-lo, porque a ordem será selecionada três linhas abaixo!
Obrigado, Sergey, pela explicação muito detalhada e compreensível! Coloco a linha com o bilhete de pedido pendente logo após o início do ciclo e tudo funcionou bem.
Sim ... Preste atenção e preste atenção. Isso é o que realmente me falta. Mais uma vez, obrigado!
Atenciosamente, Vladimir.
Bom dia, estimados especialistas!
Hoje enfrentei mais duas questões que não entendo, mas em um código inteiramente retirado da Referência MQL5. Desta vez, eu mesmo não escrevi nada, mas apenas tomei um exemplo pronto.
Abro Referência MQL5 / Constantes, Enumerações e Estruturas / Estruturas de Dados / Estrutura de uma Solicitação Comercial. Eu o encontro lá:
Estrutura do pedido comercialIsto é claro. Sou seguido por um exemplo com este código:
Estou tentando entender a linha destacada em amarelo. Uma pergunta surge imediatamente: O que o PositionGetDouble(POSITION_PRICE_OPEN) tem a ver com issose este exemplo estiver relacionado a pedidos pendentes? Talvez, deveria haver uma linha como esta:
Só encontro isto na guia Especialistas: Caros especialistas, por favor me ajudem a entender este exemplo, por que ele está no diretório, mas seu código não funciona?
Cumprimentos, Vladimir.
Caros especialistas, por favor me ajudem a entender este exemplo, por que ele está no livro de referência, mas seu código não funciona?
Atenciosamente, Vladimir.
Eu escrevi sobre isso há algumas páginas.
Este é o fórum para comércio, sistemas automatizados de comércio e testes estratégicos.
Qualquer pergunta de novatos sobre MQL4 e MQL5, ajuda e discussão de algoritmos e códigos
Alexey Viktorov, 2022.02.20 10:24
Sasha, você não pode pensar em nada pior do que usar exemplos da documentação ou exemplos de tumblr. E você também perdeu a bandeira de terminação forçada de enquanto loop em algum lugar. No total ... sem palavras.Eu escrevi sobre isso há algumas páginas
Olá Alexey!
É muito triste que uma empresa tão séria tenha uma atitude tão ruim em relação aos manuais.
Atenciosamente, Vladimir.
Olá Alexey!
É muito triste que uma empresa tão séria tenha uma atitude tão não séria em relação ao manual.
Atenciosamente, Vladimir.
Há outro erro neste exemplo. Ou completamente cego.
Entre os campos obrigatórios listados há uma expiração, mas no código do exemplo eu não vejo onde a expiração é atribuída. Ao invés disso, o desvio permitido do preço é atribuído.
Ainda há um erro neste exemplo. Ou talvez eu esteja completamente cego...
Entre os campos obrigatórios listados há a expiração, mas no exemplo de código não vejo onde a expiração é atribuída. Em vez disso, é especificado o desvio admissível do preço.
Não apenas o tempo de expiração, mas deve estar lá também:
Atenciosamente, Vladimir.
Não só isso, mas também deve haver um tempo de expiração:
Atenciosamente, Vladimir.
Estou me dirigindo a Artem Trishkin, a moderadora e organizadora desta filial!
De sua parte, você tem a possibilidade de passar todas as perguntas relacionadas com o Guia da MQL5 para MQL?
Se não for muito incômodo, você pode atualizar esta página pelo menos?
Atenciosamente, Vladimir.Estou me dirigindo a Artem Trishkin, a moderadora e organizadora deste tópico!
Você tem a possibilidade de transmitir à MQL5 todas as perguntas relacionadas ao Guia MQL5?
Se você não se importa, pelo menos esta página pode ser atualizada ?
Com todo o respeito, Vladimir.Você também pode relatar isso neste tópico.
Você pode relatar isso também neste tópico.
Obrigado pela dica, Alexey! Esperarei a resposta neste tópico primeiro, mas se nada acontecer, informarei no tópico Erros, Erros, Perguntas.
Atenciosamente, Vladimir.
Obrigado pela dica, Alexey! Primeiro vou esperar por uma resposta neste tópico, mas se nada acontecer, então vou recorrer ao tópico Erros, Erros, Perguntas.
Atenciosamente, Vladimir.
Você não obterá nenhuma resposta dos desenvolvedores neste tópico. Se você encontrou um erro, certifique-se de que foi realmente um erro, relate-o ao setor manifestado por Alexey. Não há necessidade de esperar a ação dos moderadores sobre isto - também somos humanos, e às vezes também não temos tempo.