Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 101

 
Vitaly Muzichenko:
Não está claro. Se for necessário parar a EA, então a variante sugerida lida com isso, se não houver necessidade de pará-la, então deixe-a negociar e não a limite de forma alguma. Se quisermos negociar sob demanda após a parada, basta mudar o tempo, Deficiente se tornará realidade e o programa continuará a funcionar
Ok, obrigado.
 
trader781:
Ok, obrigado.

Você provavelmente quer ter a opção de especificar nos parâmetros de entrada: "Trocar após fechar, ou não trocar após fechar"?

Se for o caso, então aqui está:

extern bool OneTrade = true;

// OnTick
if(OneTrade && !Disabled) return;

Eu não errei com a bandeira.

 
Vitaly Muzichenko:

Você provavelmente quer ter a opção de especificar nos parâmetros de entrada: "Trocar após fechar, ou não trocar após fechar"?

Se for o caso, então aqui está:

extern bool OneTrade = true;

// OnTick
if(OneTrade && !Disabled) return;

Não pareço ter feito nada de errado com a bandeira

Ok, eu entendi, foi o que perdi. Pensei que uma variável seria suficiente se colocada corretamente.
 
Vitaly Muzichenko:

Obrigado!

A questão é: quão correto é este registro, ele está no início do programa, enquanto que em todo o programa muito Tempo[0] e Tempo[1] são usados, e não devem ser chamados todas as vezes, ele está escrito em uma variável. Parece não haver erros fora da matriz, mas tudo está definido superficialmente:

datetime TM[], TIME0, TIME1;

//------------
void OnTimer()

ArraySetAsSeries(TM, true);
  if(CopyTime(_Symbol, PERIOD_CURRENT, 0, 2, TM)==-1) return;
   TIME0 = TM[0];
   TIME1 = TM[1];

Obrigado!

Basicamente, não faz nenhuma diferença se você acessar uma variável ou uma célula de array. Talvez seja apenas a velocidade de aquisição, mas eu acho que é microscópica, fazer uma medição com variáveis e acessar o array diretamente.
 
Vitaly Muzichenko:

posso pedir-lhe para ajustá-lo um pouco?

Colocar uma linha vertical ao preço atual

ou um link para uma EA, onde isso esteja disponível

Quero entender como distribuir os parâmetros do bot para que ele funcione

 
trader781:

posso pedir-lhe para ajustá-lo um pouco?

Colocar uma linha vertical ao preço atual

ou um link para uma EA, onde isso esteja disponível

Quero entender como distribuir os parâmetros do bot para que ele funcione

Primeiro, você tem que girar a exibição das citações em 90 graus.
 
Alexey Viktorov:
Primeiro você tem que girar a exibição da cotação em 90 graus.

Posto 998.

Não me importa se é horizontal ou vertical, é que neste momento o que eu fiz lá não funciona

 
trader781:

Posto 998.

Não me importa se é horizontal ou vertical, é que agora o que eu fiz lá não funciona

Não, lamento não estar me metendo nisso.
 
Tenho notado que as pessoas frequentemente pedem uma rede de arrasto ou uma função de equilíbrio. Criei uma função de plano para mover uma parada para um determinado nível de equilíbrio e seguir uma posição de parada pelo valor de algum indicador, que desenha suas linhas na tabela de preços (MA ou parabólico, por exemplo), passado para a função.

#property strict // в самое начало кода вашей программы (если нету там ещё)


// Функцию - за пределы остальных функций программы
//+------------------------------------------------------------------+
//| Трейлинг по значению + перенос стопа на уровень безубытка        |
//+------------------------------------------------------------------+
void TrailingByLevel(string symbol_name,           // Имя символа
                     int magic_number,             // Magic ордера
                     double level_of_trail,        // Уровень, на который ставим стоп (например МА или Parabolic SAR)
                     int trailing_start,           // Профит в пунктах для старта трала
                     int trailing_step,            // Шаг трала в пунктах
                     int trailing_stop,            // Отступ стоплосс от уровня МА или SAR в пунктах
                     int profit_for_breakeven=15,  // Профит в пунктах для переноса стопа в безубыток
                     int breakeven_level=5,        // Уровень безубытка в пунктах
                     bool use_trail=true,          // Флаг использования трала
                     bool use_breakeven=false      // Флаг использования безубытка
                     )
   {
   int lv=StopLevel(symbol_name)+1;                // Получаем значение Stop Level по символу + 1 пункт (из отдельной функции)
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS)) {
         if(OrderMagicNumber()!=magic_number)   continue;         //Если Магик не наш - идем к следующему ордеру
         if(OrderSymbol()!=symbol_name)         continue;         //Если Символ не наш - идем к следующему ордеру
         //--- покупки
         if(OrderType()==OP_BUY) {
            int    digits=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
            double point=(SymbolInfoDouble(symbol_name,SYMBOL_POINT));
            double pb=SymbolInfoDouble(symbol_name,SYMBOL_BID);
            double profit=pb-OrderOpenPrice();                    // Профит позиции в цене (без комиссий и свопов)
            //--- безубыток
            if(use_breakeven) {
               //--- если профит в цене больше заданного
               if(profit>=profit_for_breakeven*point) {
                  int err=ERR_NO_ERROR;
                  double sl=NormalizeDouble(OrderOpenPrice()+breakeven_level*point,digits);
                  if(pb-lv*point>sl && OrderStopLoss()<sl) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                  if(err==ERR_MARKET_CLOSED) return;
                  }
               }
            //--- трал
            if(use_trail) {
               //--- если профит в пунктах больше заданного, или изначально задан меньше ноля
               if(profit>=trailing_start*point || trailing_start==EMPTY) {
                  int err=ERR_NO_ERROR;
                  double sl=NormalizeDouble(level_of_trail-trailing_stop*point,digits);  // вычисляем новый уровень стоплосс по значению, переданному в функцию
                  //--- Если новое значение СЛ не ближе Stop Level и если новое положение СЛ больше старого+шаг СЛ, то модифицируем стоп позиции
                  if(pb-lv*point>sl && OrderStopLoss()+trailing_step*point<sl) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                  if(err==ERR_MARKET_CLOSED) return;
                  }
               }
            }

         //--- Продажи
         if(OrderType()==OP_SELL) {
            int    digits=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
            double point=(SymbolInfoDouble(symbol_name,SYMBOL_POINT));
            double pa=SymbolInfoDouble(symbol_name,SYMBOL_ASK);
            double profit=OrderOpenPrice()-pa;                    // Профит позиции в цене (без комиссий и свопов)
            //--- безубыток
            if(use_breakeven) {
               //--- если профит в цене больше заданного
               if(profit>=profit_for_breakeven*point) {
                  int err=ERR_NO_ERROR;
                  double sl=NormalizeDouble(OrderOpenPrice()-breakeven_level*point,digits);
                  if(pa+lv*point<sl && (OrderStopLoss()>sl || OrderStopLoss()==0)) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                  if(err==ERR_MARKET_CLOSED) break;
                  }
               }
            //--- трал
            if(use_trail) {
               //--- если профит в пунктах больше заданного, или изначально задан меньше ноля
               if(profit>=trailing_start*point || trailing_start==EMPTY) {
                  int err=ERR_NO_ERROR;
                  double sl=NormalizeDouble(level_of_trail+trailing_stop*point,digits);  // вычисляем новый уровень стоплосс по значению, переданному в функцию
                  //--- Если новое значение СЛ не ближе Stop Level и если новое положение СЛ больше старого+шаг СЛ, то модифицируем стоп позиции
                  if(pa+lv*point<sl && (OrderStopLoss()-trailing_step*point>sl || OrderStopLoss()==0)) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                  if(err==ERR_MARKET_CLOSED) break;
                  }
               }
            }
         }
      }
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
   }
//+------------------------------------------------------------------+
Em geral, se alguma coisa - pergunte. Ou correto.
 
Artyom Trishkin:
Tenho notado que as pessoas frequentemente pedem uma rede de arrasto ou uma função de equilíbrio. Criei uma função de plano para mover uma parada para um determinado nível de equilíbrio e seguir uma posição de parada pelo valor de algum indicador, que desenha suas linhas na tabela de preços (MA ou parabólico, por exemplo), passado para a função.


Em geral, se alguma coisa - pergunte. Ou correto
Olá Artem, e o que na CodeBase você não vai colocar? Pelo menos mais um código correto estará lá.
Razão: