[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 686

 

itum:

Como resolver este problema ? Ga

Faça o manuseio de condições apenas uma vez no início do bar.

Alternativamente, ponha uma bandeira que é colocada se um pedido for feito e reinicie quando as condições mudarem significativamente.

 

Уважаемые програмисты.

Por favor, diga-me o que inserir (e onde inserir, se possível) no código para fazer a EA abrir uma posição com o lote anterior multiplicado por 2 se o comércio anterior estava perdendo.

Muito obrigado.

Só quero lhe fazer uma pergunta: O que devo fazer se quiser abrir uma posição?

 
Procure por EAs com o nome de código Martingale.
 

Roger:
Ищите советники с кодовым названием Мартингейл.

Tenho procurado um, mas não funciona para mim.

Encontrei uma que deveria dobrar muito se um comércio anterior estivesse perdendo, mas que não quer funcionar.


 
Isso provavelmente significa que se lhe for oferecido código aqui, você mesmo não pode colocá-lo em sua EA, certo?
 
Roger:
Isso provavelmente significa que se lhe for oferecido código aqui, você mesmo não será capaz de inseri-lo em sua EA, certo?

Não, isso significa que a EA não estava funcionando, e eu não consigo encontrar uma que funcione com o código de que preciso.
 
cyclik33:

Não, isso significa que a EA não estava funcionando, e não consigo encontrar uma que funcione com o pedaço de código que preciso.

Nas variáveis globais, o valor inicial do lote é definido:

extern double Lot = 0.1

Aí atribuímos este valor à variável, que passará o valor do lote para a função de abertura de posição:

double Lots_New = Lot;
Depois de fechar a posição, vamos verificar se há lucro/perda:
if (isLossLastPos(NULL, -1, Magic))
   Lots_New *= 2;
else if (!isLossLastPos(NULL, -1, Magic))
   Lots_New = Lot;

E a própria função, graças a Igor Kim.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг убыточности последней позиции.                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isLossLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    if (OrderProfit()<0) return(True);
  }
  return(False);
}
 

cyclik33:

Caros programadores.
Por favor, informe-me o que inserir (e onde inserir se possível) no código para fazer a EA abrir uma posição com o lote anterior multiplicado por 2, se o comércio anterior estava perdendo.
Agradeço antecipadamente.
Boris.

Boris, não é nada difícil, aqui está uma função simples que implementa o princípio do martingale:

//+------------------------------------------------------------------+
double getMartinLot(double lot, double x){         //ФУНКЦИЯ УПРАВЛЕНИЯ ОБъЕМОМ ТОРГОВ ПО СИСТЕМЕ МАРТИНГЕЙЛА
   static double balance_before, balance_after;    //ДЛЯ ХРАНЕНИЯ СОСТОЯНИЯ БАЛАНСА ДО И ПОСЛЕ СДЕЛОК
   static double save_Lot;
   balance_after = AccountBalance();               //СОХРАНЕНИЕ ТЕКУЩЕГО СОСТОЯНИЯ БАЛАНСА
   if(balance_after >= balance_before){            //ПРОВЕРКА ИЗМЕНЕНИЯ БАЛАНСА
      save_Lot = lot;                              //ЕСЛИ ОН НЕ ИЗМЕНИЛСЯ ИЛИ СТАЛ БОЛЬШЕ, ТО СБРАСЫВАЕМ ЛОТ ДО БАЗОВОГО
   }else{
      save_Lot *= x;                               //ЕСЛИ СТАЛ МЕНЬШЕ ТО УВЕЛИЧИВАЕМ ЛОТ НА Х РАЗ
   }
   balance_before = balance_after;                 //СОХРАНЯЕМ СОСТОЯНИЕ БАЛАНСА ПОСЛЕ РАБОТЫ
   return(save_Lot);
}
//+------------------------------------------------------------------+

Passar o volume inicial( loteduplo ), e o passo(duplo x) como parâmetros.
Insira o método diretamente no OrderSend em vez do parâmetro de volume.

Exemplo de uma chamada de função:

if(OrdersTotal() == 0){
   OrderSend(Symbol(), OP_BUY, getMartinLot(0.1, 2), Ask, 10, Bid-25*Point, Bid+25*Point);
}
 
Alguém conhece um indicador que retorna vários ZigZag extrema recentes?