[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

 
NameLess:


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 :))) ).
 
NameLess:
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:)

 

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.

)))

 
nemo811:

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)
 
NameLess:

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.
 
nemo811:

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.

 
nemo811:

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 :)

 
obrigado!
 
NameLess:

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):

//--------------------------------------------------------------------
extern int     MAGIC       = 0;        //уникальный номер ордера
extern bool    BUY         = false;    //открыть ордер BUY
extern bool    BUY_STOP    = false;    //поставить ордер BUY STOP
extern bool    BUY_LIMIT   = false;    //поставить ордер BUY LIMIT
extern bool    SELL        = false;    //открыть ордер SELL
extern bool    SELL_STOP   = false;    //поставить ордер SELL STOP
extern bool    SELL_LIMIT  = false;    //поставить ордер SELL LIMIT
extern double  Lot         = 0.1;      //объем ордера
extern int     takeprofit  = 0;        //уровень выставления TP, если 0, то TP не выставляется
extern int     stoploss    = 0;        //уровень выставления SL, если 0, то SL не выставляется
extern int     DistanceSet = 40;       //расстояние от рынка для отложенника
extern int     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 )
   {                  
      case 1:   return;
      case 2:   Alert("Нет связи с торговым сервером ",Symbol());return;
      case 3:   Alert("Error неправильные параметры ",Symbol());return;
      case 130: Alert("Error близкие стопы   Ticket ",Symbol());return;
      case 134: Alert("Недостаточно денег   ",Symbol());return;
      case 146: Alert("Error Подсистема торговли занята ",Symbol());return;
      case 129: Alert("Error Неправильная цена ",Symbol());return;
      case 131: Alert("Error Неправильный объем ",Symbol());return;
      case 4200:Alert("Error Объект уже существует ",Symbol());return;
      default:  Alert("Error  " ,err," ",Symbol());return;
   }
}

+ balcões apropriados.

Obrigado.

Razão: