Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 94

 
void CheckForClose()
  {
   double PriceHigh, PriceLow;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
   
   PriceHigh = iCustom (Symbol(), 0, "ExtremeTMALine", TimeFrame, HalfLength , Price, ATRMultiplier, ATRPeriod, Interpolate, TrendThreshold, Distances, 1, 0); 
   PriceLow = iCustom (Symbol(), 0, "ExtremeTMALine", TimeFrame, HalfLength , Price, ATRMultiplier, ATRPeriod, Interpolate, TrendThreshold, Distances, 2, 0); 
   
   
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
        {
         if(Low[1]<=PriceHigh && Ask>PriceHigh) OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Ask<=PriceLow && High[1]>PriceLow) OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
         break;
        }
     }
//----
  }

artmedia70

Voltando aos meus carneiros, em relação ao fechamento de uma posição sobre o preço cruzando uma linha indicadora. Eu acho que o erro está nesta função

if(Volume[0]>1) voltar;

Li no tutorial que em vez de contar carrapatos podemos abrir (fechar) uma posição ao aparecer de barras. Isso é possível? Em caso afirmativo, você pode me dar uma dica de como programá-lo para a minha situação.

 
alexey1979621:

artmedia70

Voltando aos meus carneiros, em relação ao fechamento de uma posição sobre o preço cruzando uma linha indicadora. Eu acho que o erro está nesta função

if(Volume[0]>1) voltar;

Li no tutorial que em vez de contar carrapatos podemos abrir (fechar) uma posição ao aparecer de barras. Isso é possível? Em caso afirmativo, você pode nos enviar uma dica sobre como programá-lo para a minha situação.

Talvez seja útil:

A função retorna verdadeiro quando uma nova barra aparece na M15

bool CheckOpenM15()
{
   static int PrevTime=0;
   if (PrevTime==iTime(NULL, PERIOD_M15,0)) return(false);
   PrevTime=iTime(NULL, PERIOD_M15,0);
   return(true);
}
 
ex1m:

Por favor, avise!!!

Estou escrevendo ordens pendentes em um determinado momento

{

Definir tempo aberto

}

se ((condição)==verdadeiro)//
{
OrderSend ( OP_BUYSTOPP, parâmetros);// abrir um pedido BuyStop pendente
OrderSend ( OP_SELLSTOP, parâmetros);// abrir um pedido SellStop pendente
}

Acho que escrevi o tempo corretamente; ele o detecta mas, por alguma razão, abre ou Sell Stop ou Buy Stop e não abre os dois de uma só vez. Tento abrir duas ordens pendentes de tipos diferentes (Bistop e Sellstop) ao mesmo tempo e uma a uma. A questão parece ser primitiva, por favor, ajude os chupa-chupas).

Para colar o código corretamente aqui, clique primeiro no SRC e depois copie o código ali.

Se o entendi corretamente, em determinado momento preciso abrir um OP_BUYSTOP e um OP_SELLSTOP ? É aceitável ter qualquer outra ordem pendente neste momento? Por exemplo, há ordens pendentes, mas temos que apagar as antigas antes de abrir as novas?

 
artmedia70:
Este erro se refere a objetos gráficos, não a ordens

.
Exatamente! O erro se refere a objetos, mas não tenho objetos neste EA...


borilunad:
Boa noite, Victor! Estranho, a ordem pendente não é um objeto! Talvez você tenha algum objeto que já deveria ter sido apagado, mas não foi!

Boa tarde, Boris! O Expert Advisor não cria objetos. Este erro provém da função que coloca uma ordem pendente. Aqui está a versão da função (para o testador):

bool OpenPendingBuy(double lot, double price)
{
   int g_ticket = -1;
   double OOP = price + i_distanceFromLastPos * pt;

   if (OOP > Ask)
   {
       fCheck_ValidPendingOOP(Symbol(), OP_BUYSTOP, OOP);
       
       g_ticket = OrderSend(Symbol(), OP_BUYSTOP, lot, ND(OOP), 30, 0, 0, NULL, i_magic, 0, CLR_NONE);
   }
   if (g_ticket > 0)
   {
       return (true);
   }
   else
       pr ("OpenPendingBuy(): Ордер послать не удалось " + GetLastError());
   
   return (false);
}

Se nenhum pedido tiver sido feito, isto significa que um bloqueio foi acionado:

else
       pr ("OpenPendingBuy(): Ордер послать не удалось " + GetLastError());

Este é o bloco que relata o erro.


Alguém já entendeu a lógica?

 
artmedia70:

Como não há resposta à pergunta, aqui está uma função que devolverá o bilhete do último conjunto de pedidos:



Obrigado!!! exatamente o que eu preciso

 
hoz:
Exatamente! O erro diz respeito a objetos, mas não tenho objetos neste EA...

Boa tarde, Boris! O Expert Advisor não cria objetos. Este erro provém da função que coloca uma ordem pendente. Aqui está a versão da função (para o testador):

Se o pedido não tiver sido feito, isto significa que um bloqueio foi acionado:

Este é o bloco que relata um erro.

Alguém já entendeu a lógica?

Então, verifique sua verificação de erro? Deve haver algo de errado aí!
 
borilunad:
Então, verifique sua verificação de erro? Deve haver algo de errado aí!

Heh)) O que há de errado com Boris? É tudo transparente...

pr é uma função de impressão. E o erro, já é uma constante padrão. Logicamente, é inaceitável ser assim de todo. Se você ainda tem uma suspeita sobre a função pr, aqui está ela:

//+-------------------------------------------------------------------------------------+
//| Распринтовка на экран                                                               |
//+-------------------------------------------------------------------------------------+
void pr (string txt)
{
string info [];
ArrayResize(info,20);
string h,m,s,cm; int i;
h=DoubleToStr(Hour(),0);    if (StringLen(h)<2) h="0"+h;
m=DoubleToStr(Minute(),0);  if (StringLen(m)<2) m="0"+m;
s=DoubleToStr(Seconds(),0); if (StringLen(s)<2) s="0"+s;
txt=h+":"+m+":"+s+" - "+txt;
for(i=20-1; i>=1; i--)
info[i]=info[i-1];
info[0]=txt;
for(i=20-1; i>=0; i--)
if(info[i]!=""){
cm=info[i];
ObjectCreate ("txtw"+i,OBJ_LABEL,0,0,0);
ObjectSet    ("txtw"+i,OBJPROP_CORNER,1);
ObjectSet    ("txtw"+i,OBJPROP_XDISTANCE,10);
ObjectSet    ("txtw"+i,OBJPROP_YDISTANCE,30+15*i);
ObjectSetText("txtw"+i,cm, 10, "Times New Roman", Green);}}
 

  • Alguém entende a lógica?


O lote está normalizado? Bem e verifique o preço.

São i_magic, pt, i_distanceFromLastPos global?

 
splxgf:

i_magic, pt, i_distanceFromLastPos are global?


Sim. As variáveis com i_ são variáveis de entrada (da palavra intut, que pode ser alterada pelo usuário...), e pt também é uma variável global, que é visível em todos os lugares...
splxgf:


  • Alguém entende a lógica?


O lote está normalizado? Bem e verifique o preço.


Não, o lote não foi normalizado. Nunca o encontrei no testador... E o que muito tem a ver com o objeto (erro 4200)?
 
hoz:

Ocasionalmente, mas não constantemente, recebo um erro de 4200 quando estabeleço uma ordem pendente. De acordo com a documentação, este erro significa que o objeto já existe:

ERR_OBJECT_ALREADY_EXISTS 4200 Объект уже существует

Acontece que uma ordem deste tipo já está no mercado quando a ordem pendente é enviada?

Talvez, algum outro programa crie um objeto gráfico com o mesmo nome, ao qual a EA reage. Talvez você precise mudar os nomes dos objetos.
Razão: