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 1098

 
wishmast:

Rapazes, eu já estou com a cabeça no lugar. Como faço para que a EA faça pedidos pendentes em altas e baixas, por exemplo, 8 velas, com um take profit de 1/4.

Eu faço algo assim:

duplo Vhod1=iHighest(Symbol(),0,MODE_HIGH,8,0);

duplo Vhod2=iLowest(Symbol(),0,MODE_LOW,8,0);

duplo TP=((Vhod1-Vhod2)/4)+Vhod1;


Tentei mudar os parâmetros, mas continuo a fazer paradas erradas ou a fixar o preço em 7.00000; não está claro de onde vem

iHighest, iLowest lhe dará o endereço do castiçal, mas não o preço.
 
evillive:
iHighest, iLowest dará o endereço da vela, não o preço.

É isso mesmo. Precisamos de

duplo Vhod1=iHigh(Symbol(), 0, iHighest(Symbol(),0,MODE_HIGH,8,0)));

duplo Vhod2=iLow(Symbol(), 0, iLowest(Symbol(),0,MODE_LOW,8,0)));

 
alvlaf:


Coloquei mal, mas mesmo assim não teria funcionado bem porque... Porque...) De qualquer forma, deveria ser assim:

1) criar uma variável AllowNewOrders no inite (se ela não existir)

2) Criar uma nova ordem, até que feche, OnTick deste símbolo está ocioso, mas irá executar OnTick de outro símbolo

3) Executar a etapa 2 para os outros símbolos até que o limite de MaxOpenOrders seja alcançado

4) quando o pedido terminar, se estiver perdendo ou tiver valor zero, proibir a abertura de novos pedidos para todas as cópias através de AllowNewOrders

[aqui está o problema imediato - quando a série perdedora terminar, AllowNewOrders=1, mas e se MaxOpenOrders>1 e houver várias dessas sessões?]

5) Se o ponto 4 não for cumprido, então você poderá abrir novos pedidos.

O programa DEVE funcionar quando MaxOpenOrders=1. Talvez haja um problema se proibirmos novos pedidos após uma ordem não lucrativa AllowNewOrders=0 e o próximo OrderSend, por alguma razão, não abrir o pedido. Escreverei abaixo como me protejo para este caso...

int OnInit()                     
{
   if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders", 1);
   return(INIT_SUCCEEDED);
}
//----------------------------------------------------------------------
void OnTick()
{
   if (CountTrades() == 0)  // Количество ордеров должно равняться нулю
   {
      if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
      // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }
      else GlobalVariableSet("AllowNewOrders", 1);
      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0) 
      // Если прибыль последней сделки равняется нулю, то открывается такая же
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder(), 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }
      else GlobalVariableSet("AllowNewOrders", 1);
      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
      || CountHistTrades() == 0)
      // Если последняя сделка прибыльная или это первая сделка, то открывается ордер
      {
         if (OrdersTotal() >= MaxOpenOrders || GlobalVariableGet("AllowNewOrders") == 0) return;
         if (SignalBuy())
         {
            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
         }
         if (SignalSell())
         {
            ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
         }
      }
   }
}
 
A13ksandr:

Escreverei abaixo como me protejo para esta eventualidade...

int Tries = 5;
ResetLastError();
do
{
   // решение ошибок с предыдущей попытки открытия ордера, например:
   if (_Error == 134)
   {
      _Lot = NormalizeDouble(_Lot / 2, 2);
      if (_Lot < SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN)) _Lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);
   }
   if (_Error == 138) RefreshRates();
   Ticket = OrderSend(Symbol(), OP_BUY, _Lot, Ask, 3, 0, 0, NULL, 0, 0, clrNONE);
   if (Ticket < 0)
   {
      _Error = GetLastError();
      Sleep(100);
   }
   Tries--;
}
while (Ticket < 0 && Tries > 0);

Se a solução de erro for adequadamente prevista, a taxa de sucesso da abertura de um pedido aumenta.

 
Olá! Por favor, avise-me se eu uso a função do correio (cada pedido tem seu próprio mágico) - http://forum.forexpeoples.ru/showthr...=1#post1715092 , como seria encontrar os últimos pedidos para vendas ou compras, ou atualizar uma série de pedidos se não cada pedido tem seu próprio mágico, mas cada série de pedidos tem seu próprio mágico. Isto é, assume-se que quando uma nova série de ordens com seu próprio magik é aberta, a antiga série de ordens continua a abrir suas próprias ordens com seus próprios magiks. Espera-se que cada série tenha seu próprio lucro e existem muitas dessas séries de pedidos.

Como o código abaixo pode mudar sob tais condições?
for(cnt=OrdersTotal()-1;cnt>=0;cnt--){
if (!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) continua;
if(OrderSymbol()!=Symbol()) continua; if(OrderMagicNumber() < startMagicNumber || OrderMagicNumber() >= startMagicNumber + MaxTrades) continua;

Eu coloquei o código para gerar um magik ao abrir as primeiras encomendas de uma série, mas aqui está o problema ao abrir novas encomendas na mesma série.

O próprio código para gerar a magia do post:
//+
+
// obter a próxima magia na série
int getNextMagicNumber(){ int magic = VAZIO;

if (OrderTotal() == 0) {
return(startMagicNumber);
}

para (int i = startMagicNumber; i < startMagicNumber + MaxTrades; i++){
magic = checkMarketByMagic(i);
if (magic != EMPTY) break;
}

if (magic === EMPTY){
magic = startMagicNumber; // primeiro na série
} else {
magic++; // próximo na série
}

return(magic);
}
//+
+ // keekkenen: verifique uma ordem no mercado com uma determinada magia
int checkMarketByMagic(int magic){
for(int i = 0; i < OrderTotal(); i++){
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continua;
if(OrderSymbol() != Symbol()) continua;
if(OrderMagicNumber() == magic) return(magic);
}
return(EMPTY);
}
//+------------------------------------------------------------------+
 
Boa tarde senhores do fórum,
desculpem se confundi os fios, mas não encontrei o lugar correto para postar o TEMA, então não me dêem pontapés.

Às vezes, enquanto navegava na Internet para novos Expert Advisors, me deparei com um que não prestava atenção, porque sua descrição era padrão, do qual há muito, mas não prestava atenção a seu nome.

Se eu não o tivesse visto ou lido, por favor, me dê o nome, e o google fará seu trabalho ou, se eu tiver um, eu o aceitarei como um presente. Talvez exista um assessor similar que realize ações similares.

Descreverei o significado do Expert Advisor (não há nada muito sofisticado, o que eu preciso agora).

Grosso modo, o trabalho seria parecido com o seguinte:

1. Abrir uma posição manualmente, por exemplo, comprar.
2. O Expert Advisor define o Stop Loss e Take Profit de acordo com as configurações.
3. O pedido é fechado no takeprofit - a EA abre imediatamente outra compra e estabelece o mesmo stoploss e takeprofit até pegar o primeiro stoploss ou se houver um takeprofit final.
4. Se a posição é fechada por Stop Loss, o robô não faz mais nada. O Expert Advisor espera que o próximo pedido seja aberto manualmente.

Isso é tudo.

Eu ficaria muito grato.
 
A13ksandr:


Inseri-o mal, mas mesmo assim não funcionaria como deveria porque... Porque...) De qualquer forma, é assim:

1) criar uma variável AllowNewOrders no initem (se ela não existir)

2) Criar uma nova ordem até que feche OnTick deste símbolo está ocioso, mas OnTick do outro símbolo irá funcionar

3) Executar a etapa 2 para os outros símbolos até que o limite de MaxOpenOrders seja alcançado

4) quando o pedido terminar, se estiver perdendo ou tiver valor zero, proibir a abertura de novos pedidos para todas as cópias através de AllowNewOrders

[aqui está o problema imediato - quando a série perdedora terminar, AllowNewOrders=1, mas e se MaxOpenOrders>1 e houver várias dessas sessões?]

5) Se o ponto 4 não for cumprido, então você poderá abrir novos pedidos.

O programa DEVE funcionar quando MaxOpenOrders=1. Talvez haja um problema se proibirmos novos pedidos após uma ordem não lucrativa AllowNewOrders=0 e o próximo OrderSend, por alguma razão, não abrir o pedido. Escreverei abaixo como estou me protegendo para este caso.

Obrigado Alexander, vou verificar isso amanhã. [daí o problema imediatamente - quando as séries perdidas terminam, AllowNewOrders=1, e se MaxOpenOrders>1 e houver várias sessões?] Se MaxOpenOrders>1 por algum valor, então na idéia AllowNewOrders=1 também deveria ser maior pelo mesmo valor. Mas não precisamos nos preocupar com isso e o MaxOpenOrders deve ser removido de todo, porque nesta versão do programa não está planejada mais de uma série de qualquer forma.
 
alvlaf:
Obrigado Alexander, vou verificar isso amanhã. [daí o problema imediatamente - quando a série perdida termina, AllowNewOrders=1, mas se MaxOpenOrders>1 e houver mais de uma sessão?] Se MaxOpenOrders>1 por algum valor, então na idéia AllowNewOrders=1 também deveria ser maior pelo mesmo valor. Mas não preciso me preocupar com isso por enquanto e o MaxOpenOrders deve ser omitido completamente, porque nesta versão do programa não está planejada mais de uma série de qualquer forma.
Eu tentei, funcionou bem durante os primeiros cinco minutos, depois comecei a abrir vários negócios (4) de uma só vez e para o mesmo par com lote maior. Alexander, não entendo bem como a variável global adquire e muda seu valor em sua versão?
 

Olá a todos!

Aqui está um objeto gráfico sobre um gráfico.

Seus parâmetros são tempo, valor, código. O valor corresponde ao preço ao qual o objeto está localizado.

Existe alguma forma de obter seu tempo e valor (através de uma função ou outra coisa)?

\\\\\

Ou, num contexto mais amplo, existem objetos (além das linhas de tendência, linhas Fibonacci, Gannets) que nos permitem obter seu tempo e preço instantaneamente?

Preciso colocar alguns marcadores na tabela e obter informações a partir deles. Desenho de linhas de tendência, fibo, etc... - É muito pesado e lento...

Obrigado pelas respostas!

PS Acaba de começar a estudar...

 
ilmel:

Olá a todos!

Aqui está um objeto gráfico sobre um gráfico.

Seus parâmetros são tempo, valor, código. O valor corresponde ao preço ao qual o objeto está localizado.

Existe alguma forma de obter seu tempo e valor (através de uma função ou outra coisa)?

\\\\\

Ou, num contexto mais amplo, existem objetos (além das linhas de tendência, linhas Fibonacci, Gannets) que podem ser imediatamente derivados no tempo e no preço?

Preciso colocar algumas marcas na tabela e obter informações a partir delas. Desenho de linhas de tendência, fibo, etc... - É muito pesado e lento...

Obrigado pelas respostas!

PS Acaba de começar a estudar...

https://docs.mql4.com/ru/objects/objectgetdouble
https://docs.mql4.com/ru/objects/objectgetinteger
Razão: