[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.
[Excluído]  

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().

:)

[Excluído]  
//+------------------------------------------------------------------+
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

[Excluído]  
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

}

}

[Excluído]  

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.