[Arquivo!] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por ela. Não poderia ir a lugar algum sem você - 2. - página 84
Como você deve ter notado, a verdadeira razão não é olhar para o código, mas entender como ele funciona. Se você confia no Expert Advisor, desejo-lhe sucesso e tudo se resolverá)
Eu mesmo inventei uma bicicleta e escrevi minha coruja do zero, mas sei onde e como as coisas funcionam e sei por que não funcionam e onde procurar erros)
que é sobre isso)
Obrigado. Eu já estou no caminho certo!))) Eu tinha que cavar, mas percebi o que eu queria (pelo menos funciona de alguma forma :))) ).
Você sabe como estabelecer o controle do número do pedido? Concordo, a pergunta provavelmente traz um sorriso não disfarçado, transformando-se em risos em lugares))) Mas só ando mexendo em códigos mt-sh há cerca de uma semana. Eu ainda não conheço todas as palavras )))) Inteligente )))
nemo811: Você sabe como estabelecer o controle do número do pedido? Concordo, a pergunta provavelmente causa um sorriso indisfarçado, transformando-se em risos em alguns lugares)))) Mas só ando mexendo em códigos mt-sh há cerca de uma semana. Eu ainda não conheço todas as palavras )))) inteligente ))))
não posso me considerar um especialista))))
Se você precisa abrir uma ordem duas vezes sob certas condições, então você precisa criar esta condição.
Em geral, comecei a escrever meu próprio programa há cerca de meio ano, e um simples detalhe me ajudou: pense no que você quer que a EA faça ou em uma peça específica de código.
Neste caso, seria mais fácil dar um exemplo, e então poderei dizer mais especificamente o que fazer e como fazê-lo, se eu souber a solução:)
O código funcionou - obrigado. Mas quando pessoas experientes dizem tais palavras, você começa a se perguntar o que está errado.
)))
Se o código faz o que deve fazer - então é isso))) o que eu provavelmente quis dizer foi que o código pode abrir ordens sem parar, mas nós o fizemos para que tudo fosse aberto e adiado uma vez. então está tudo bem)
Se o código faz o que deve fazer, então tudo bem)) o que eu provavelmente quis dizer foi que o código pode abrir ordens sem parar, mas nós o fizemos uma vez por abertura e adiamento).
esta é uma proteção no caso de você ter posições abertas no caso de precisar reiniciar o cliente, caso contrário ele reabrirá um lote inteiro de pedidos
também recomendo perguntar: pense logicamente em cada linha - o que pode impedir que ela funcione.
Aqui está uma versão ligeiramente desatualizada do que estou trabalhando atualmente. O autor drknn me deu permissão para carregá-lo.
Ele não apenas deu permissão para colocá-lo lá fora, ele deu abertamente permissão para mudar o código como você quiser, vendê-lo e até mesmo direitos autorais para quem você quiser :)
esta é uma proteção no caso de você ter posições abertas no caso de precisar reiniciar o cliente. caso contrário, ele reabrirá um lote inteiro de pedidos
Obrigado - este é um ponto importante. Resolvi este problema e acrescentei contadores (graças ao Sergeev) para a contagem de pedidos.
O código agora parece ser o seguinte (não abre dados desnecessários ao reiniciar o terminal):
//--------------------------------------------------------------------externint MAGIC = 0; //уникальный номер ордераexternbool BUY = false; //открыть ордер BUYexternbool BUY_STOP = false; //поставить ордер BUY STOPexternbool BUY_LIMIT = false; //поставить ордер BUY LIMITexternbool SELL = false; //открыть ордер SELLexternbool SELL_STOP = false; //поставить ордер SELL STOPexternbool SELL_LIMIT = false; //поставить ордер SELL LIMITexterndouble Lot = 0.1; //объем ордераexternint takeprofit = 0; //уровень выставления TP, если 0, то TP не выставляетсяexternint stoploss = 0; //уровень выставления SL, если 0, то SL не выставляетсяexternint DistanceSet = 40; //расстояние от рынка для отложенникаexternint Proskalz = 3; //максимально допустимое отклонение цены для рыночных ордеров//--------------------------------------------------------------------double SL,TP;
//--------------------------------------------------------------------int start()
{
if (BUY)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0;
OPENORDER ("Buy");
BUY=false;
}
if (SELL)
{
if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Bid + stoploss*Point,Digits); else SL=0;
OPENORDER ("Sell");
SELL=false;
}
if (BUY_STOP)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + DistanceSet*Point + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask + DistanceSet*Point - stoploss*Point,Digits); else SL=0;
OPENORDER ("Buy Stop");
BUY_STOP=false;
}
if (SELL_STOP)
{
if (takeprofit!=0) TP = NormalizeDouble(Bid - DistanceSet*Point - takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Bid - DistanceSet*Point + stoploss*Point,Digits); else SL=0;
OPENORDER ("Sell Stop");
SELL_STOP=false;
}
if (BUY_LIMIT)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask - DistanceSet*Point + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - DistanceSet*Point - stoploss*Point,Digits); else SL=0;
OPENORDER ("Buy Limit");
BUY_LIMIT=false;
}
if (SELL_LIMIT)
{
if (takeprofit!=0) TP = NormalizeDouble(Bid + DistanceSet*Point - takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Bid + DistanceSet*Point + stoploss*Point,Digits); else SL=0;
OPENORDER ("Sell Limit");
SELL_LIMIT=false;
}
return(0);
}
void OPENORDER(string ord)
{
int SchBuy=SchBuy_b(MAGIC);
int SchSell=SchSell_b(MAGIC);
int SchBuyStop=SchBuyStop_b(MAGIC);
int SchSellStop=SchSellStop_b(MAGIC);
int SchBuyLimit=SchBuyLimit_b(MAGIC);
int SchSellLimit=SchSellLimit_b(MAGIC);
int ticket = -1;
int err;
while (ticket<0)
{
if (SchBuy<1) {if (ord=="Buy") ticket=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),Proskalz,SL,TP,"",MAGIC,0);}
if (SchSell<1) {if (ord=="Sell") ticket=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),Proskalz,SL,TP,"",MAGIC,0);}
if (SchBuyStop<1) {if (ord=="Buy Stop") ticket=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask + DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
if (SchSellStop<1) {if (ord=="Sell Stop") ticket=OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(Bid - DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
if (SchBuyLimit<1) {if (ord=="Buy Limit") ticket=OrderSend(Symbol(),OP_BUYLIMIT, Lot,NormalizeDouble(Ask - DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
if (SchSellLimit<1) {if (ord=="Sell Limit") ticket=OrderSend(Symbol(),OP_SELLLIMIT,Lot,NormalizeDouble(Bid + DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
if (ticket==-1) //неудачная попытка
{
ShowERROR();
err++;Sleep(2000);RefreshRates();
}
if (ticket || err >10) return;
}
return;
}
//--------------------------------------------------------------------void ShowERROR()
{
int err=GetLastError();
switch ( err )
{
case1: return;
case2: Alert("Нет связи с торговым сервером ",Symbol());return;
case3: Alert("Error неправильные параметры ",Symbol());return;
case130: Alert("Error близкие стопы Ticket ",Symbol());return;
case134: Alert("Недостаточно денег ",Symbol());return;
case146: Alert("Error Подсистема торговли занята ",Symbol());return;
case129: Alert("Error Неправильная цена ",Symbol());return;
case131: Alert("Error Неправильный объем ",Symbol());return;
case4200:Alert("Error Объект уже существует ",Symbol());return;
default: Alert("Error " ,err," ",Symbol());return;
}
}
Como você deve ter notado, a verdadeira razão não é olhar para o código, mas entender como ele funciona. Se você confia no Expert Advisor, desejo-lhe sucesso e tudo se resolverá)
Eu mesmo inventei uma bicicleta e escrevi minha coruja do zero, mas sei onde e como as coisas funcionam e sei por que não funcionam e onde procurar erros)
que é sobre isso)
Obrigado. Eu já estou no caminho certo!))) Eu tinha que cavar, mas percebi o que eu queria (pelo menos funciona de alguma forma :))) ).
Você sabe como estabelecer o controle do número do pedido? Concordo, a pergunta provavelmente causa um sorriso indisfarçado, transformando-se em risos em alguns lugares)))) Mas só ando mexendo em códigos mt-sh há cerca de uma semana. Eu ainda não conheço todas as palavras )))) inteligente ))))
não posso me considerar um especialista))))
Se você precisa abrir uma ordem duas vezes sob certas condições, então você precisa criar esta condição.
Em geral, comecei a escrever meu próprio programa há cerca de meio ano, e um simples detalhe me ajudou: pense no que você quer que a EA faça ou em uma peça específica de código.
Neste caso, seria mais fácil dar um exemplo, e então poderei dizer mais especificamente o que fazer e como fazê-lo, se eu souber a solução:)
exemplo na página 83, tarefa de sergeev
O código funcionou - obrigado. Mas quando pessoas experientes dizem tais palavras, você começa a se perguntar o que está errado.
)))
exemplo na página 83, tarefa de sergeev
O código funcionou - obrigado. Mas quando pessoas experientes dizem tais palavras, você começa a se perguntar o que está errado.
)))
Se o código faz o que deve fazer - então é isso))) o que eu provavelmente quis dizer foi que o código pode abrir ordens sem parar, mas nós o fizemos para que tudo fosse aberto e adiado uma vez. então está tudo bem)
Se o código faz o que deve fazer, então tudo bem)) o que eu provavelmente quis dizer foi que o código pode abrir ordens sem parar, mas nós o fizemos uma vez por abertura e adiamento).
Bom. Mais uma vez, obrigado.
A propósito, eu recomendo colocar algo como
if ( OrdersTotal()!=0)
{
BUY = false;
BUY_STOP = false;
BUY_LIMIT = false;
SELL = false;
SELL_STOP = false;
SELL_LIMIT = false;
}
esta é uma proteção no caso de você ter posições abertas no caso de precisar reiniciar o cliente, caso contrário ele reabrirá um lote inteiro de pedidos
também recomendo perguntar: pense logicamente em cada linha - o que pode impedir que ela funcione.
Aqui está uma versão ligeiramente desatualizada do que estou trabalhando atualmente. O autor drknn me deu permissão para carregá-lo.
Ele não apenas deu permissão para colocá-lo lá fora, ele deu abertamente permissão para mudar o código como você quiser, vendê-lo e até mesmo direitos autorais para quem você quiser :)
Só não entre em uma briga por direitos ali :)
via indicador https://docs.mql4.com/ru/indicators/iBandsOnArray
A propósito, eu recomendo colocar algo como
if ( OrdersTotal()!=0)
{
BUY = false;
....
esta é uma proteção no caso de você ter posições abertas no caso de precisar reiniciar o cliente. caso contrário, ele reabrirá um lote inteiro de pedidos
Obrigado - este é um ponto importante. Resolvi este problema e acrescentei contadores (graças ao Sergeev) para a contagem de pedidos.
O código agora parece ser o seguinte (não abre dados desnecessários ao reiniciar o terminal):
+ balcões apropriados.
Obrigado.