[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 132

 
Roman.:

IMHO, não é complicado, mas muito fácil de "dirigir" ou enviar,

Bem, é certamente mais fácil "enviar", ou seja, "enviar" do que sugerir. E na verdade, eu não pedi nada para me meter em um livro didático. Escreveu um duplicado em um só lugar, é verdade, mas a essência não muda.

artmedia70:

Finalmente, diga-me exatamente o que você quer fazer... Por exemplo: o MAA mais ou menos está subindo e está acima do MAA mais ou menos e o preço está em algum ponto abaixo/abaixo do MAA mais ou menos e se for verdade, então coloque um pedido pendente a alguma distância. Vou lhe dar um algoritmo rudimentar. Porque é difícil direcioná-lo na direção certa, quando seus fragmentos de código são arrancados do contexto. Afinal, a tarefa é para a quinta série (exageradamente)



Aqui estou anexando uma versão de teste do código e publicando-a em meu post também.

//+-----------------------------------------------------------------------------------+
//|                                                                       test_Ma.mq4 |
//|                                                                               hoz |
//|                                                                                   |
//+-----------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

extern string ___H0 = " ___________ Параметры МА ____________ ";
extern int i_TF = 0,
           i_fastMaPeriod = 10,
           i_slowMaPeriod = 21;
extern string ___H1 = " _____ Параметры ордера _______";
extern int i_magic = 3333021;
extern double i_thresholdFromMa = 5;                           // Отступ от МА
// Машечки
double fastMa,
       slowMa;
double pt;
// Переменные рыночного окружения
double g_spread,
       g_stopLevel,
       g_tickSize;
// Идентификаторы положений машек
#define MA_DIRECT_TO_UP      0                                 // Машки направлены вверх
#define MA_DIRECT_TO_DOWN    1                                 // Машки направлены вниз
#define MA_DIRECT_TO_NONE   -1                                 // Машки во флете
#define SIGNAL_BUY           0                                 // Сигнал на покупку
#define SIGNAL_SELL          1                                 // Сигнал на продажу
#define SIGNAL_NO           -1                                 // Сигнала нет

//+-------------------------------------------------------------------------------------+
//| Функция иницилизации                                                                |
//+-------------------------------------------------------------------------------------+
int init()
{
   GetMarketInfo();
   
   if (Digits  == 2 || Digits == 4)
       pt = Point;
   if (Digits == 1 || Digits == 3 || Digits == 5)
       pt = Point * 10;
   if (Digits == 6)
       pt = Point * 100;
   if (Digits == 7)
       pt = Point * 1000;
   

  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации                                                              |
//+-------------------------------------------------------------------------------------+
int deinit()
{
//----
   
//----
  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Сбор рыночных данных                                                                |
//+-------------------------------------------------------------------------------------+
void GetMarketInfo()
{
  g_spread = MarketInfo(Symbol(),MODE_SPREAD);
  g_stopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL);
  g_tickSize = MarketInfo(Symbol(),MODE_TICKSIZE);
}
//+-------------------------------------------------------------------------------------+
//| Функция нормализации                                                                |
//+-------------------------------------------------------------------------------------+
double ND(double A)
{
  return (NormalizeDouble(A, Digits));
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
   if ((fastMa + i_thresholdFromMa * pt) > Ask)           // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником

       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
   
   if (ticket > 0)
 
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell(double fastMa, double slowMa)
{
   int ticket = -1;
   
   if ((fastMa - i_thresholdFromMa * pt) < Bid)           // Проверка что цена открытия ниже Bid, т.к. у нас вход отложенником
   
       ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(fastMa - i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
       
   if (ticket > 0)
    
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем относительное положение машек                                              |
//+-------------------------------------------------------------------------------------+
int GetStateMa(double fastMa, double slowMa)
{
   if (fastMa > slowMa)                          // Если условия выполнены, то..
       return (MA_DIRECT_TO_UP);                 // ..машки направлены вниз
   
   if (fastMa < slowMa)                          // Если условия выполнены, то..
       return (MA_DIRECT_TO_DOWN);               // машки направлены вверх
   
   return (MA_DIRECT_TO_NONE);                   // Машки не имеют выраженного направления
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal)
{
   if (signal == SIGNAL_BUY)                     // Если сигнал на покупку..
       if (!OpenBuy(fastMa, slowMa))             // ..покупаем
          return(false);
   
   if (signal == SIGNAL_SELL)                   // Если сигнал на продажу..
       if (!OpenSell(fastMa, slowMa))           // ..продаём
          return(false);
       
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   if (GetStateMa(fastMa, slowMa) == MA_DIRECT_TO_UP)       // Если машки указывают вверх..
       if ( MathAbs(Ask - fastMa) <= i_thresholdFromMa * pt ) // ..зазор между ценой покупки и машки, <= i_thresholdFromMa..
           return(SIGNAL_BUY);                       // ..функция возвращает сигнал покупки

   if (GetStateMa(fastMa, slowMa) == MA_DIRECT_TO_DOWN)      // Если машки указывают вниз..
       if ( MathAbs(Bid - fastMa) <= i_thresholdFromMa * pt ) // ..зазор между ценой продажи и машки, <= i_thresholdFromMa..
       return(SIGNAL_SELL);                          // ..функция возвращает сигнал продажи
   
   return (SIGNAL_NO);
}
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,1);
   slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,1);

// Отслеживание открытия нового бара
   static datetime lastBarTime = 0;    // Время проведения последних рассчётов
   
   if (lastBarTime == iTime(NULL, 0, 0))         // На текущем баре все необходимые действия..
       return (0);                      // ..уже были выполнены

// Рассчёт сигнала   
   int signal = GetSignal();
   
// Проведение торговых операций
   if (signal != SIGNAL_NO)
       if (!Trade(signal))
           return (0);
   
   lastBarTime = iTime(NULL, 0, 0);              // На текущем баре все необходимые действия..
                                       // .. успешно выполнены
  return (0);
}

As condições dizem claramente que o preço do pedido está acima (abaixo) do MA+(-) compensado do MA.

Aqui está:

if ( MathAbs(Ask - fastMa) <= i_thresholdFromMa * pt )

O sinal só deve ser calculado quando o preço estiver naárea de "intervalo" do travessão MA +(-).

Em uma função de compra, por exemplo:

ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);

Comprar deve estar acima dofastMa pori_thresholdFromMa * pt.

Na verdade, não está lá. Ou é uma falha no idioma ou é um bug na ondulação. De que outra forma posso explicar o que eu preciso? Eu dei todo o código sem condições e funções adicionais (apenas um sinal nu e aberto).

Já está escrito claramente(para um testador, eu não o verifiquei de verdade!)

Eis como se abre:

Lugar errado para abrir...

artmedia70:


Em relaçãoao destacado: trabalho sobre os preços abertos, então não haverá um redesenho dos MAs na barra zero

Fiz uma condição especial no 1º bar, para que não houvesse confusão. O principal é como executá-lo...
Arquivos anexados:
test_ma.mq4  8 kb
 
A bandeira de início de, por exemplo, os quatro cinco minutos de cada hora deve ser definida no indicador.
if( Minute()==15)
Nada está faltando. Empurre-a na direção certa.
 

Tenho uma pergunta - se eu usar uma média móvel com um deslocamento para a direita ao formular meus critérios comerciais - ou seja, o valor do deslocamento é positivo.

Então, ao formar o sinal não devo usar o valor da média móvel no zero ou na primeira barra, mas na barra com o índice correspondente ao valor do turno.

 
Operr:
A bandeira de início de, por exemplo, os quatro cinco minutos de cada hora deve ser definida no indicador.


if( Minute()==15)// так будет работать в течении 1 минуты (от 15 до 16)
if( Minute()>=15)// так от 15 минут и до конца текущего часа
 
Tincup:

Tenho uma pergunta - se eu usar uma média móvel com um deslocamento para a direita quando eu formular meus critérios comerciais - ou seja, o valor do deslocamento é positivo.

Então, ao formar o sinal não devo usar o valor da média móvel no zero ou na primeira barra, mas na barra com o índice correspondente ao valor do turno.


Coloque a média móvel na tabela e veja qual índice você precisa. Você pode vê-lo visualmente.
 
hoz:

Bem, sem dúvida é mais fácil "enviar", ou seja, "enviar" do que sugerir. Na verdade, eu não pedi nada para me espetar em um livro didático. Escrevi um duplicado em um só lugar, mas a essência não muda.

Aqui eu estou anexando a variante de código de teste e estou publicando-a em meu post também.

As condições dizem claramente que o preço do pedido está acima (abaixo) do MA+(-) compensado do MA.

Aqui está:

O sinal só deve ser calculado quando o preço estiver naárea de "intervalo" do travessão MA +(-).

Em uma função de compra, por exemplo:

Comprar deve estar acima dofastMa pori_thresholdFromMa * pt.

Na verdade, ele não está lá. Ou é um bug na minha língua ou é um bug no meu mouse. De que outra forma posso explicar o que eu preciso? Eu dei um código inteiro sem condições e funções adicionais (apenas um sinal nu e abertura).

Já está escrito claramente(para um testador, eu não o verifiquei de verdade!)

Eis como se abre:

Fiz uma condição especial no 1º bar, para que não houvesse confusão. O principal é como executá-lo...
Mais uma vez, eu pergunto: Quando exatamente você quer fazer o pedido? Não é sua resposta de código (não queira entendê-lo - há o suficiente de seus próprios códigos para análise), e apenas palavras,

Por exemplo: eu quero colocar um pedido pendente acima/abaixo de um MA a uma distância de ... bah, bah, bah, bah, bah, bah, bah ...

Pela segunda vez, por favor explique, é tão difícil? Teríamos resolvido seu problema há muito tempo.

 
Além disso: se você tem fastMA e slowMA definidos como globais, por que passá-los para uma função? Todas as funções podem vê-las de qualquer forma, sem passar seus parâmetros para a função chamada.
 

Boa tarde.

Você pode aconselhar como lidar com os GAPs nos EAs?

Muitas vezes recebo GEPs durante o fim de semana, e depois que eles ocorrem o trabalho com os pedidos pendurados, como consertá-los, obrigado de antemão!

 

Artyom, o que você acha que funcionará mais rápido, expressão com MathMax ou com se?

double dist = MathMax(MathMax(NormalizeDouble(Dist*Point,Digits),spread),MathMax(StopLevel,FreezeLevel));//это?
// или это?
double dist = NormalizeDouble(Dist*Point,Digits);
if(dist < spread) dist = spread;
if(dist < StopLevel) dist = StopLevel;
if(dist < FreezeLevel) dist = FreezeLevel;


Não expliquei em palavras, porque é claro que esta expressão me serve para evitar erros 130, e me serve perfeitamente!

Obrigado de antemão!

 
hoz:

Coloque a média na tabela e veja qual índice você precisa. Você pode vê-lo visualmente.

Eu entendi. Não entendi bem sua resposta, então vou lhe perguntar novamente. Eu entendi corretamente que ao formular as condições comerciais

Você deve usar o valor MA para o número correspondente de barras para trás, mas não o valor marcado com uma seta amarela na figura.

Eu desenhei a figura como entendi sua resposta.