Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 31
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
O erro está em algum lugar mais acima no código, na área de seleção de ordem.
Eu não toco no resto.
Em qualquer caso, você precisa ver o código anterior e o seguinte, não apenas as linhas de condição.
...
Você não pode limpar o código e colá-lo corretamente com o SRC, não é mesmo?
Por que você não aplica o OrderSelect antes de tentar excluir?
...
Não sei por que você precisa de tantos loops ali, quando você pode preencher os campos de estrutura necessários sobre o número de pedidos e posições em um.
Eu removi coisas desnecessárias, e também removi a exclusão. Você não precisa apagar por bilhete (você ainda precisa saber antes de apagar), mas no laço para encontrar a ordem correta por índice, e apagá-la.
Portanto, precisamos de mais uma função para pesquisar e excluir pedidos, que deve ser chamada no caso de uma condição, mas que tipo de condição - eu não a entendi imediatamente ao consultar seu código, e não tive tempo de consultá-la. Descreva as condições necessárias em palavras e nós lhe diremos como apagar.
Eu tinha escrito por conta própria, sem olhar, então pode haver erros na função preenchendo a estrutura com o número de pedidos e posições - não a verifiquei.
input double LotB=0.1; // Лот Buy
input double LotS=0.1; // Лот Sell
input int Pointsl=100; // StopLoss в пунктах
input int Pointtp=100; // TakeProfit в пунктах
input int NumBars=10; // Количество баров для поиска Max/Min
input int Magic=100500; // Magic
//--- global variables
struct DataNumOrders
{
int buy; // Количество позиций Buy
int sell; // Количество позиций Sell
int buy_limit; // Количество ордеров BuyLimit
int buy_stop; // Количество ордеров BuyStop
int sell_limit; // Количество ордеров SellLimit
int sell_stop; // Количество ордеров SellStop
};
DataNumOrders numOrders; // Количество ордеров
double lotB, lotS;
int pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
numBars=(NumBars<1?1:NumBars>Bars?Bars:NumBars);
pointsl=(Pointsl<0?0:Pointsl);
pointtp=(Pointtp<0?0:Pointtp);
double minLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
double maxLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- заполним структуру количеством ордеров и позиций
GetNumOrders(Symbol(),Magic,numOrders);
//--- найдём максимальную и минимальную цены за bars свечей
double maxPrice=0.0; double minPrice=DBL_MAX;
for(int i=0; i<numBars; i++) {
double max_i=iHigh(Symbol(),PERIOD_CURRENT,i);
if(max_i>maxPrice) maxPrice=max_i;
double min_i=iLow(Symbol(),PERIOD_CURRENT,i);
if(min_i<minPrice) minPrice=min_i;
}
//--- выставим BuyLimit
if(numOrders.buy_limit==0 && numOrders.buy==0) {
double slB=(pointsl==0?0:NormalizeDouble(minPrice-pointsl*Point(),Digits()));
double tpB=(pointtp==0?0:NormalizeDouble(minPrice+pointtp*Point(),Digits()));
int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minPrice, 3, slB, tpB, "", Magic, 0, clrRed);
if(ticketUP==-1) Print("ERROR OP_BUY");
else Print("OP_BUY OK");
}
//--- выставим SellLimit
if(numOrders.buy_limit==0 && numOrders.sell==0) {
double slS=(pointsl==0?0:NormalizeDouble(maxPrice+pointsl*Point(),Digits()));
double tpS=(pointtp==0?0:NormalizeDouble(maxPrice-pointtp*Point(),Digits()));
int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxPrice, 3, slS, tpS, "", Magic, 0, clrBlue);
if(ticketD==-1) Print("ERROR OP_SELL");
else Print("OP_SELL OK");
}
//--- Тут должно быть удаление, но не понятно при каких условиях. Опишите их
//---
string a=(numBars==1)?"bar: ":IntegerToString(numBars,1)+" bar's: ";
Comment("Last ", a, "max ", DoubleToStr(maxPrice, Digits()), ", min ", DoubleToStr(minPrice, Digits()),".");
}
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров |
//+------------------------------------------------------------------+
void GetNumOrders(string symbol_name, int magic_number, DataNumOrders &number_of) {
ZeroMemory(number_of);
for(int i=OrdersTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS)) {
if(OrderMagicNumber()!=magic_number) continue;
if(OrderSymbol()!=symbol_name) continue;
if(OrderType()==OP_BUY) number_of.buy++;
if(OrderType()==OP_BUYLIMIT) number_of.buy_limit++;
if(OrderType()==OP_BUYSTOP) number_of.buy_stop++;
if(OrderType()==OP_SELL) number_of.sell++;
if(OrderType()==OP_SELLLIMIT) number_of.sell_limit++;
if(OrderType()==OP_SELLSTOP) number_of.sell_stop++;
}
}
}
//+------------------------------------------------------------------+
Em geral, o que você está tentando fazer com este código, desculpe, arrepiante?
como escrever o seguinte :
Se o preço mudou em 1%, digamos dia ABERTO mais do que dia Slose em 1%.
como escrever o seguinte :
Se o preço mudou em 1%, digamos que o dia de ABERTURA é maior que o dia de FECHADA em 1%.
Isso é diferente, agora é claro a que é relativo o 1% ;)
O Expert Advisor conta os mínimos e máximos para os últimos X bares e faz pedidos por eles. Além disso, se houver uma diminuição de máximo ou aumento de mínimo, será necessário apagar a ordem correspondente e abri-la pelos novos dados.
Por que excluir quando você pode modificar o preço de ajuste e parar e retirar em relação ao novo nível? Afinal de contas, você só coloca ordens pendentes quando não há ordens pendentes e nenhuma posição de mercado. Portanto: se houver uma ordem pendente no mercado e não houver uma posição correspondente no mercado, então só precisamos modificar os preços na ordem pendente - o preço estabelecido para um novo nível e sua ordem de parada - respectivamente para o novo nível.
Toda vez que você precisar se lembrar dos preços encontrados de Max e Min. Se o preço atual encontrado do Max for menor que o anterior, modificamos o BuyLimit pendente e memorizamos o novo preço do Max. Pelo preço Min, espelhe-o.