[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 29

 

Olá...

Eu escrevi um EA, mas me deparei com este problema:

Tenho pedidos opostos e, por exemplo, para COMPRAR tenho 150 pips stop e 150 pips profit, para VENDER os mesmos níveis são definidos, mas apenas revertidos (ou seja, o que é para comprar lucro, depois para vender stop), ou seja, na verdade eu tenho que fechar tudo simultaneamente, tanto vender com comprar como comprar com vender..... mas há outra coisa, espalhe!)) E dessas duas ordens opostas as outras 8 já estão abertas (claro que se todas as oito são necessárias, as condições são diferentes para elas, elas também são opostas 4/4)


Como posso programar corretamente o código para fechar todas as ordens quando elas atingem o mesmo preço de uma só vez? Pois no testador, quando testo, o preço às vezes atinge um nível desejado, por exemplo, vender fechado (não atingindo um nível predeterminado, acredito que seja um spread) e comprar pendurado e depois de um curto período de tempo cai e comprar fechado na parada, então não consigo ver o resultado correto.


Eu ficaria grato se você pudesse expressar sua idéia programática, ou seja, código.


A fim de entendê-lo com mais detalhes, eu lhe dou a parte em que minhas duas ordens opostas (primeiras) são abertas.

if (by == FALSE) 
   {   g_ticket_112 = OrderSend(Symbol(), OP_BUY, Lots, NormalizeDouble(Ask, Digits), 1, NormalizeDouble(Ask - SL * Point, Digits), 
       NormalizeDouble(Ask + TP * Point, Digits), "", 111, 0, Blue);
   if (g_ticket_112 > 0) by = TRUE;
   } 
     
     if (se == false) 
   {for (g_pos_116 = OrdersTotal() - 1; g_pos_116 >= 0; g_pos_116--) 
   {if (OrderSelect(g_pos_116, SELECT_BY_POS, MODE_TRADES)) 
   {if (OrderSymbol() != Symbol() || OrderMagicNumber() != 111) continue;
    if (se == false) 
   {g_ticket_113 = OrderSend(Symbol(), OP_SELL, Lots, NormalizeDouble(Bid, Digits), 1, 
    OrderTakeProfit(),OrderStopLoss() , "", 222, 0, Blue);
    if (g_ticket_113 > 0) se = TRUE;}}}} 
 
Vocês têm um roteiro que estica o horário durante todos os fins de semana, ou seja, que o horário não se funde com a segunda-feira e permaneça vazio nos sábados e domingos.
 

Olá a todos.

A questão é: você tem uma função que detecta a abertura de um novo bar(não importa o tempo), ou, mais precisamente, diferentes variantes de encontrar um novo bar.

 
dmitriy086:

Olá a todos.

A questão é: você tem uma função que detecta a abertura de uma nova barra (não importa o tempo), ou, mais precisamente, pode diferentes variantes (reboques) encontrar uma nova barra.


Recordar o tempo velho = Tempo[0] e comparar o tempo lembrado se( tempo velho !=Time[0])Print("Hurray for a new bar!!!");

SZY: os reboques estão na função iTime().

:)

 
//+------------------------------------------------------------------+
bool fNewBar()
  {
   static datetime NewTime=0;
   if(NewTime!=iTime (Symbol(),0,0))
    {
     if(NewTime==0)
      {
       NewTime=iTime (Symbol(),0,1);return(false);
      }      
     NewTime=iTime (Symbol(),0,0);
     return(true);
    }
   return(false);     
  }
//+----------------------------------------------------------------------------+

IgorM, o problema é que esta f-fi está em um gráfico sintético onde o iTime[0] pode ser igual ao iTime[1], então como podemos nos livrar do tempo para que o Expert Advisor abra apenas uma negociação em um novo bar?
 
dmitriy086:
IgorM, o problema é que esta f-fi está em uma tabela sintética onde o iTime[0] pode ser igual ao iTime[1], então como podemos nos livrar do tempo para que a EA abra apenas uma negociação em um novo bar?


se o tempo das barras 0 e 1 não puder ser igualado por alguma razão desconhecida - o tipo de tempo de data armazena dados em segundos, altere o tempo da barra em pelo menos 1 segundo

então tente lembrar todas as características da primeira barra fechada, ou seja, OHLC, volume e tempo aberto - se você mudar até mesmo um parâmetro, isso significa uma nova barra

iBars() mostrará o número de barras no período de tempo atual e será limitado pelas configurações do terminal, você pode tentar comparar o número de barras com o número de barras armazenado e no momento de uma nova aparência da barra, esses valores são diferentes - mas nem sempre, funcionou para mim dessa forma, mas provavelmente por causa do número de construção MT4 essa opção pode não funcionar

 
Você tem um código pronto, por acaso? Não consigo descobrir como lembrar OHLC[1] e compará-lo com OHLC[0]...
 
dmitriy086:
Você não tem um código pronto, tem? Não consigo descobrir como memorizar OHLC[1] e compará-lo com OHLC[0]...


OHLC é um acrônimo comum para Open,High,Low,Close

comparar não com zero, mas o primeiro com o memorizado anteriormente, ou seja

init(){

oldHigh = High[1];

///

}

start(){{

duplo tmp = alto[1];

if(tmp !=oldHigh) {oldHigh = tmp;

//cheque o resto dos parâmetros da barra

}

}

 

Obrigado pela dica, vou dar uma olhada...

 

Por favor, informe como definir a verificação correta na condição de abertura da posição - se há ou não uma posição aberta para este instrumento. E se houver uma posição para o símbolo (qualquer venda ou compra), então a abertura não ocorre, caso contrário o sinal para abrir a posição é acionado?

Aqui está o código (acho que ele é responsável pela abertura de posições):

if (NumberOfPositions("" ,-1,Magic)>=2)  флаг1=1;//если число позиций >= 2
if (NumberOfPositions("" ,-1,Magic)<1 )  флаг1=0;//если нет откр. позиций
if ( TradeDOWN==true && флаг1==0) {//если условия соответствуют заданным  
//продаем 1-й символ и покупаем второй символ
//----------------------------------------
if (NumberOfPositions(Symbol_1,OP_SELL,Magic)<1){//если нет поз.селл и поз.бай по 1-му символу
 if (NumberOfPositions(Symbol_1,OP_BUY,Magic)<1)
 {
 SL=0;TP=0;//открываем позицию, задаем стопы :
if(StopLoss_1>0)   SL=Bid_Tiker1+POINT_Tiker1*StopLoss_1;
if(TakeProfit_1>0) TP=Bid_Tiker1-POINT_Tiker1*TakeProfit_1; 
 ti=OpenPosition(Symbol_1, OP_SELL, Lots_1,0 ,0,Magic);
if(StopLoss_1>0 || TakeProfit_1>0) {//ставим стопы 
if (OrderSelect(ti, SELECT_BY_TICKET)) ModifyOrder(-1, SL, TP, clModifySell);}
                                   }}//если нет поз.селл и поз.бай по 1-му символу
//--------------------------------------
if (NumberOfPositions(Symbol_2,OP_BUY,Magic)<1){//если нет поз. бай и поз. селл по 2-му символу 
 if (NumberOfPositions(Symbol_2,OP_SELL,Magic)<1)
 {
   SL=0;TP=0;//открываем позицию, задаем стопы :
if(StopLoss_2>0)   SL=Bid_Tiker2-POINT_Tiker2*StopLoss_2;
if(TakeProfit_2>0) TP=Ask_Tiker2+POINT_Tiker2*TakeProfit_2;   
ti=OpenPosition(Symbol_2, OP_BUY, Lots_2,0,0,Magic);
if(StopLoss_2>0 || TakeProfit_2>0) {//ставим стопы 
if (OrderSelect(ti, SELECT_BY_TICKET))ModifyOrder(-1, SL, TP, clModifyBuy); }
                                   }}//если нет поз. бай и поз. селл по 2-му символу

Parece estar correto pela lógica, mas ainda abre várias posições para um símbolo.

P.S. Eu não sou o programador. Se for possível em mais detalhes, explique ao boneco.