[Arquivo!] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por ela. Não poderia ir a lugar algum sem você - 2. - página 497

 
Favor aconselhar como abrir um pedido em um novo bar somente uma vez ????
 

inserir código no EA, eu tinha algo assim até que o apaguei, eu estava usando um cronograma de hora em hora

orderselect - selecione a última ordem na história

tomar o tempo de seu fechamento e retirar a hora de fechamento

e antes de abrir o pedido, estabelecer uma condição de que a hora atual NÃO seja igual à hora de fechamento do pedido a partir do histórico

 

Ajude-me com este problema, minha variável TP é zerada após a segunda atualização de preço, ou seja, o consultor abre um pedido, e TP e Bid não são ambos iguais a zero, então o preço é atualizado novamente e TP é zero, embora não exista tal comando no código, eu tive um problema em puxar SL para cima, mas agora acontece que o problema está na definição de TP

int start()
{
//
double TP;
double SL;
if (OrderTotal()==0)
{
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,0,Bid+4*Point);
OrderSelect(OrdersTotal()-1,SELECT_BY_POS);
TP=OrderTakeProfit();
}
Alerta ("TP=" + TP);
Alerta ("Bid=" + Bid);
if (OrderTotal()>0)
{
if (TP-Bid<3*Point)
{
Alerta ("Aproximação TP por 1 ou 2");
Alerta ("TP=" + TP);
Alerta ("Bid=" + Bid);
}
}
//----
return(0);
}

 
LazarevDenis:

Ajude-me com este problema, minha variável TP é zerada após a segunda atualização de preço, ou seja, a EA abre um pedido e exibe valores de TP e Bid, ambos não são iguais a zero, então o preço é atualizado novamente e TP é zero, embora no código, sem tais comandos, eu tive um problema com o puxar SL para cima, mas agora acontece que o problema está na definição de TP

double TP, SL;


int start()
{
//----

if (OrdersTotal()==0)
{
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,0,Bid+4*Point);
OrderSelect(OrdersTotal()-1,SELECT_BY_POS);
TP=OrderTakeProfit();
}
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
if (OrdersTotal()>0)
{
if (TP-Bid<3*Point)
{
Alert ("Приблизился к ТП на 1 или 2");
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
}
}
//----
return(0);
}
Tente desta forma...
 
VOLDEMAR:
Favor aconselhar como abrir um pedido em um novo bar somente uma vez ????

Leia aqui: https://www.mql5.com/ru/forum/134437
 
Cmu4, muito obrigado, você tem sido muito útil
 

Olá a todos!

Há dois sinais na estratégia: um primário e um secundário. Um comércio é aberto quando o segundo sinal aparece o mais tardar 12 horas depois. Pergunta: Como posso ensinar meu Conselheiro Especialista a não reagir ao sinal, se ele aparecer após 12 horas? Por favor, se você puder dar um exemplo concreto de código

 
demlin:

Olá a todos!

Há dois sinais na estratégia: um primário e um secundário. Um comércio se abre quando o segundo sinal aparece no máximo 12 horas mais tarde. Pergunta: Como posso ensinar meu Conselheiro Especialista a não reagir ao sinal, se ele aparecer após 12 horas? Por favor, se você puder me dar um exemplo do código


Oi Dmitry. De minha parte, estou pronto para lhe oferecer a seguinte variante. Para analogia, veja o acionamento dos critérios de negociação deste artigo - há também dois sinais - veja depois da segunda figura "A primeira coisa a esperar no gráfico do DeMarker é o momento em que o DeMarker cruza as linhas MA rápida e lenta em torno de 0,7 para uma posição curta". Este é o primeiro sinal preliminar. Em seguida, esperamos pela travessia das próprias linhas MA. Este é o sinal principal, após o qual as leituras do indicador de Taichi podem ser feitas. Se as linhas MA não forem cruzadas, é considerado um sinal falso e o movimento de preços continuará. Eis como ele é implementado no meu código - na inclusão incluída das corujas que são responsáveis pelo acionamento dos critérios comerciais.

O truque principal é trabalhar através dos dois abaixo (no final) da inclusão, ajustando e reinicializando as bandeiras quando um ou outro critério comercial é acionado.

//--------------------------------------------------------------------
// Criterion.mqh
// 
//--------------------------------------------------------------- 1 --
// Функция вычисления торговых критериев.
// Возвращаемые значения:
// 10 - открытие Buy  
// 20 - открытие Sell 
// 0  - значимых критериев нет
// 
//--------------------------------------------------------------- 2 --
// Внешние переменные:
extern string A5 = "Параметры";
//extern int       Period_K = 5;            // Период K
//extern int       Period_D = 3;            // Период D
//extern int       Slowing = 3;             // Замедление

extern int Tenkan=9;
extern int Kijun=26;
extern int Senkou=52;
extern int FlatSE=7;

extern int DeMarker=25;
extern int FastMA=14;
extern int SlowMA=25;
extern double DeMarker_OpenLevel_Sell = 0.7;
extern double DeMarker_OpenLevel_Buy = 0.7;
 bool   DeMarker_Buy_signal=false, DeMarker_Sell_signal=false,
       MA_Buy_signal=false, MA_Sell_signal=false;



extern int t_trend_period =6; // для оптимизации по всем периодам от 0 до 7 шаг 1
                              // на каком ТФ работаем: 1-М1, 2-М5, 3-М15, 4-М30, 5-Н1, 6 - Н4, 7-день
 

//--------------------------------------------------------------- 3 --
int Criterion()                        // Пользовательская функция
  {
  //--------------------------------------------------------------- 4 --
 int trend_period=GetPeriod(t_trend_period); // для выбора оптимального значения рабочего ТФ

   // Параметры технич. индикат:
                 
double Taichi_1 = iCustom (Symbol(), trend_period, "Cronex Taichi",Tenkan, Kijun, Senkou, FlatSE, 0, 1);
double TaichiFor_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 3, 1);
double Signal_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 1, 1);
double SSignal_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 2, 1);

double FlatBuffer1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 4, 1);
double FlatBuffer2 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 5, 1);

double DeMarker_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker",DeMarker, FastMA, SlowMA, 0, 1);
double DeMarker_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker",DeMarker, FastMA, SlowMA, 0, 2);

double FastMA_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 1, 1);
double FastMA_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 1, 2);

double SlowMA_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 2, 1);
double SlowMA_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 2, 2);

//--------------------------------------------------------------- 5 --
   // Вычисление торговых критериев
   
   if(( (type_op_DeMarker(DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (DeMarker_Buy_signal == true && DeMarker_Sell_signal==false)) &&  // когда DeMarker пересекает медленую (выше уровня бай (0.7)) для лонг
      ( (type_op_MA (DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (MA_Buy_signal==true && MA_Sell_signal==false)) && // пересечение МА DeMarkers
   
   
      (iClose(Symbol(), trend_period,1) > Taichi_1 && Taichi_1 > TaichiFor_1 && Signal_1 > SSignal_1 && FlatBuffer1==0 && FlatBuffer2==0))
     
         {
           Print ("Taichi_1 = ", Taichi_1, "TaichiFor_1 = ",TaichiFor_1, "Signal_1 = ", Signal_1, "SSignal_1 = ",SSignal_1, "FlatBuffer1 = ", FlatBuffer1, "FlatBuffer2 = ", FlatBuffer2);
           Print ("DeMarker_1 = ", DeMarker_1, "DeMarker_2 = ",DeMarker_2, "FastMA_1 = ", FastMA_1, "FastMA_2 = ",FastMA_2, "SlowMA_1 = ", SlowMA_1, "SlowMA_2 = ", SlowMA_2);
           return(10);                      // Открытие Buy    
         }
        
   if(( (type_op_DeMarker(DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_SELL) || (DeMarker_Buy_signal==false && DeMarker_Sell_signal==true)) &&  // когда DeMarker пересекает медленую (ниже уровня селл) для шорт
      ( (type_op_MA (DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_SELL) || (MA_Buy_signal==false && MA_Sell_signal==true)) && // пересечение МА DeMarkers
        
      (iClose(Symbol(), trend_period,1) < Taichi_1 && Taichi_1 < TaichiFor_1 && Signal_1 < SSignal_1 && FlatBuffer1==0 && FlatBuffer2==0))
        {
           Print ("Taichi_1 = ", Taichi_1, "TaichiFor_1 = ",TaichiFor_1, "Signal_1 = ", Signal_1, "SSignal_1 = ",SSignal_1, "FlatBuffer1 = ", FlatBuffer1, "FlatBuffer2 = ", FlatBuffer2);
           Print ("DeMarker_1 = ", DeMarker_1, "DeMarker_2 = ",DeMarker_2, "FastMA_1 = ", FastMA_1, "FastMA_2 = ",FastMA_2, "SlowMA_1 = ", SlowMA_1, "SlowMA_2 = ", SlowMA_2);
           return(20);  
        }                       // Открытие Sell 
  
//--------------------------------------------------------------- 6 --
   return(0);                          // Выход из пользов. функции
  }
//--------------------------------------------------------------- 7 --

//для оптимизации по всем ТФ
int GetPeriod(int period)
{int periodres;
 switch(period)
  {
   case 1: periodres=1;break;
   case 2: periodres=5;break;
   case 3: periodres=15;break;
   case 4: periodres=30;break;
   case 5: periodres=60;break;
   case 6: periodres=240;break;
   case 7: periodres=1440;break;
   case 8: periodres=10080;break;
   default: periodres=1;break;
  }
return(periodres);
} 


int type_op_DeMarker(double D1, double D2, double F1, double F2, double S1,double S2)// Функция - условия для входа в рынок и сохранения их через переменные Buy_signal и Sell_signal (даже после их сработки - до отмены
               // противоположными сигналами)
               
{
      
     if (D2-S2 < 0 && D1-S1 > 0 && D1 > F1  && D1 < DeMarker_OpenLevel_Buy)
          {
             DeMarker_Buy_signal=true;
             DeMarker_Sell_signal=false;
             return(OP_BUY);
          } 
  
      if (D2-S2 > 0 && D1-S1 < 0 && D1 < F1 && D1 > DeMarker_OpenLevel_Sell)                                                                                   
          {
             DeMarker_Buy_signal=false;
             DeMarker_Sell_signal=true;
             return(OP_SELL);
          }   
   else return(-1);
     
}

int type_op_MA(double d1, double d2, double f1, double f2, double s1,double s2) // условия для входа в рынок и сохранения их через переменные Buy_signal и Sell_signal (даже после их сработки - до отмены
               // противоположными сигналами)
               

  {
          
     if (f2 - s2 < 0 && f1 - s1 > 0)
          {
             MA_Buy_signal=true;
             MA_Sell_signal=false;
             return(OP_BUY);
          } 
  
      if (f2-s2 > 0 && f1-s1 < 0)                                                                                                               
          {
             MA_Buy_signal=false;
             MA_Sell_signal=true;
             return(OP_SELL);
          }   
   else return(-1);

  }

Além disso, você salvará o tempo atual quando o critério principal for acionado usando TimeCurrent, ou seja, você especificará uma expressão do tipo x = TimeCurrent antes doretorno(OP_BUY); oureturn(OP_SELL); onde x é uma variável global do tipo datetime por analogia na primeira funçãoint_op_DeMarker. Depois faça o mesmo com a segunda funçãoint type_op_MA. - aí você memoriza a variável y = TimeCurrent;

Então você compara o valor dessas duas variáveis com o sinal de mais no cálculo do bloco de critérios comerciais (acontece que você não precisa do análogo de trabalhar com valores UTC - em vez disso, você faz uma comparação do tempo de recebimento de seus dois sinais comerciais):

 // Вычисление торговых критериев
   
   if(( (type_op_DeMarker(DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (DeMarker_Buy_signal == true && DeMarker_Sell_signal==false)) &&  // когда DeMarker пересекает медленую (выше уровня бай (0.7)) для лонг
      ( (type_op_MA (DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (MA_Buy_signal==true && MA_Sell_signal==false)) && // пересечение МА DeMarkers
   
   
      ((x+43200) < y )) //43200 - это количество секунд в 12-ти часах
     
         {
           Print ("Время сработки первого условия х(в секундах) = ", х, " Время сработки второго условия y (в секундах) = ", y);
           Print ("DeMarker_1 = ", DeMarker_1, "DeMarker_2 = ",DeMarker_2, "FastMA_1 = ", FastMA_1, "FastMA_2 = ",FastMA_2, "SlowMA_1 = ", SlowMA_1, "SlowMA_2 = ", SlowMA_2);
           return(10);                      // Открытие Buy    
         }

P.S. Mais, estou lhe enviando uma função para a possibilidade de otimizar o valor do TF de trabalho.

P.P.S. É assim que esta estrutura de código está organizada em meu código. Não excluo que existam variantes de código muito melhores para o cumprimento de tais condições da EA. :-)))

 

Como posso calcular um lucro sobre um par de moedas em minha EA?

Por exemplo, tenho sete pedidos de compra abertos em euros a preços diferentes. Como calcular um lucro em euros sem afetar outros pedidos em outros pares? ????

 

usar o SelectOrder para escanear todas as ordens abertas

verificar o par necessário (OrderSymbol)

então adicione o lucro a qualquer variável se for o OrderProfit necessário

aqui está um link com funções úteis https://docs.mql4.com/ru/trading/OrderSelect

à esquerda há um menu com operações, todas elas são descritas ali