[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 180

 
solnce600:

Bom dia a todos vocês!

Eu sou um novato. Esta é minha primeira vez tentando colocar uma idéia em código no testador.

A idéia é simples - abrir um pedido ao preço de abertura de cada candelabro horário, alternadamente para cima e para baixo.

Eu escrevi um código simples .... Mas o problema é que o programa às vezes abre mais de 1 ordem na abertura de um candelabro.

Parece-me que isso acontece quando mais de 1 carrapato chega dentro de 1 segundo.

Como alternativa, tentei colocar no cabeçalho da condição if( ) ...

OrdensTotal()==0

Apenas um pedido realmente se abre.



Mas esta variante não me convém porque no dia seguinte o castiçal dado não é aberto, já que no momento da abertura deste castiçal

já existe um número aleatório de ordens no comércio.

Eu também tentei interromper OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP); interromper a execução do OrderSend() com retorno; ..... não ajudou.


Agradecia que você me dissesse como fazer apenas 1 pedido é aberto a qualquer momento dentro de 1 segundo.

int start()

{
preço duplo=Ask;
duplo SL=Price-300*Point;
duplo TP=Preço+300*Ponto;
if( Hora()===10 && Minuto()== 00 && Segundos()==00)
OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP);
}

Experimente esta variante:
int TimeNow, TimePrev, PrevType;

int start()   
 {
  double Price,SL,TP;
     int Ticket;

  TimeNow=iTime(NULL,0,0);
  if(TimePrev==TimeNow) return(0);

  if(PrevType!=1) {
   Price=NormalizeDouble(Ask,Digits);    
   SL=NormalizeDouble(Price-300*Point,Digits);    
   TP=NormalizeDouble(Price+300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=1; } }

  else if(PrevType!=-1) {
   Price=NormalizeDouble(Bid,Digits);    
   SL=NormalizeDouble(Price+300*Point,Digits);    
   TP=NormalizeDouble(Price-300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_SELL,0.1,Price,3,SL,TP);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }
 }
 
alsu:


Muito obrigado por sua pronta resposta.
 
Diubakin:
Tente esta opção:
Muito obrigado por sua pronta resposta.
 
Prezados Profissionais! Onde posso encontrar a função SloseBy() que funciona em modo manual? Quero adicioná-lo às minhas corujas, para poder fechar a posição com o máximo menos à posição com o máximo mais, não manualmente, mas automaticamente, de acordo com as condições. Não consegui encontrá-lo na base de código. Não o encontrei no codebase. Obrigado!
 
borilunad:
Ev. pros! Onde posso encontrar a função СloseBy(), que funciona em modo manual? Quero adicioná-lo às minhas Corujas, para que não seja possível fechar a posição com o máximo menos ao oposto com o máximo mais, mas automaticamente, de acordo com as condições. Não consegui encontrá-lo na base de código. Não o encontrei no codebase. Obrigado!

Tente esta opção:

bool LockOFF(int EA_Magic) {
 double Result, PrevLoss, PrevProfit;
    int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
   bool Ans;

 MaxProfitTicket=-1; MaxLossTicket=-1;

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(OrderType()>1) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
   PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); } } // end of for

 if(MaxLossTicket==-1) return(false); // нет убыточной позиции
 if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(order_type!=OrderType()) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
   PrevProfit=Result; MaxProfitTicket=OrderTicket(); } } // end of for

 if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

 Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
 if(!Ans) { Print("Ошибка при встречном закрытие"); return(false); }
 
 return(true); }
 

Sergei, com um olhar rápido, vale a pena! Vou aparafusá-lo, fazer as condições e experimentá-lo. Muito obrigado!

Experimentei-o, funciona sem erros! Agora apenas para experimentar as condições, para obter o efeito, e ficará tudo bem! Mas isso é para amanhã!

Muito obrigado. E sonhos interessantes!

 
borilunad:
Sergei, com um olhar rápido, vale a pena! Vou aparafusá-lo, fazer as condições e experimentá-lo. Muito obrigado!
Apenas em vez de um comando contra-fecho, insira uma função contra-fecho completa - caso contrário, é apenas para o testador. E inicializar as variáveis na função.
 
artmedia70:
Apenas em vez de um comando contra-fecho, insira uma função contra-fecho completa - caso contrário, é apenas para o testador. E rubricar as variáveis na função.
Graças a Artyom, era tarde demais. Eu farei tudo de acordo com as regras para on-line hoje!
 
borilunad:
Obrigado, Artyom! Era tarde demais. Fará tudo de acordo com as regras para on-line hoje!
Boa sorte...
 

Boa tarde. Tenho uma pergunta a fazer.

Eu redesenhei este indicador para minhas próprias necessidades com grande dificuldade a partir de peças de código de outros Consultores e Indutores Especialistas. Não é um grande código e funciona da maneira que eu quero que funcione.

A questão é que ele realiza alguns cálculos internamente e mostra setas para cima ou para baixo no gráfico.

Aconselhe como fazer um Expert Advisor para abrir uma ordem na direção certa quando a seta aparecer no gráfico

Mais precisamente, eu só preciso saber qual flecha está ativa agora, acho que posso fazer o resto

Aqui está um pedaço de código para torná-lo mais claro, é uma inicialização no indicador

   SetIndexBuffer(1, Vverh);

   SetIndexStyle(1,DRAW_ARROW);

   SetIndexArrow(1,233);

   

   SetIndexBuffer(2,Vniz);

   SetIndexStyle(2,DRAW_ARROW);

   SetIndexArrow(2,234); 

Obrigado de antemão