Sygnał i potwierdzienie

O jezykach programowania w platformach i nie tylko.
Kris82
Stały bywalec
Stały bywalec
Posty: 34
Rejestracja: 11 lip 2012, 00:27

Sygnał i potwierdzienie

Nieprzeczytany post autor: Kris82 »

Witam, mam taki problem z sygnałem. dokładnie chodzi o wskaźnik macd.
Nie wiem jak zachować sygnał.Przy zmianie świecy zmienia się na 0.

Kod: Zaznacz cały

datetime LastActiontime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int sygnal;

int OnInit()
  {
//--- create timer
   EventSetTimer(60);
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   {
  double s=iMACD(NULL,0,30,52,28,PRICE_CLOSE,MODE_SIGNAL,0);
  double m=iMACD(NULL,0,30,52,28,PRICE_CLOSE,MODE_MAIN,0);
  double s1=iMACD(NULL,0,30,52,28,PRICE_CLOSE,MODE_SIGNAL,1);
  double m1=iMACD(NULL,0,30,52,28,PRICE_CLOSE,MODE_MAIN,1);
  
//---
   //Comparing LastActionTime with the current starting time for the candle
   if(LastActiontime!=Time[0])
      {
      
      if ((s<m)&&(s1>m1))
      {
      sygnal=1;
      Alert("SYGNAL ",sygnal);
      }
      if ((s>m)&&(s1<m1)&&(sygnal==1))
      {
      // Otwieramy zlecenie
      }      
      LastActiontime=Time[0];     
   }  
  }   
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   
  }
Z góry dziękuje za pomoc.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: Sygnał i potwierdzienie

Nieprzeczytany post autor: -rookie- »

Kompletnie nie rozumiem Twojego problemu... Ale skoro zaczynasz zabawe z kodowaniem EA w mql to trzeba troche poeksperymentować żeby dowiedzieć się jak coś działa. Proponuje używać wizualnych sygnałów np pionowych linii na wykresie żeby zobaczyć gdzie pojawia się sygnał, to po pierwsze. Masz tutaj małą modyfikacje, stawia czerwoną kreske w miejscu pojawienia się Twojego sygnału, następnie kolejny warunek if ((s>m)&&(s1<m1)&&(sygnal==1)) resetuje zmienna sygnal i stawia niebieska kreske żebyś zobaczył kiedy to się dzieje. Poza tym na dole jest jeszcze funkcja Print która pokazuje status zmiennej sygnal. Trzeba po prostu troche się tym pobawić żeby zobaczyć jak to działa.

Kod: Zaznacz cały

datetime LastActiontime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int sygnal;
int counter = 0;

int OnInit()
  {
//--- create timer
   EventSetTimer(60);
     
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
     
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   
  double s=iMACD(NULL,0,30,52,28,PRICE_CLOSE,MODE_SIGNAL,0);
  double m=iMACD(NULL,0,30,52,28,PRICE_CLOSE,MODE_MAIN,0);
  double s1=iMACD(NULL,0,30,52,28,PRICE_CLOSE,MODE_SIGNAL,1);
  double m1=iMACD(NULL,0,30,52,28,PRICE_CLOSE,MODE_MAIN,1);
 
//---
   //Comparing LastActionTime with the current starting time for the candle
   if(LastActiontime!=Time[0])
      {
     
      if ((s<m)&&(s1>m1))
      {
        sygnal=1;
        Alert("SYGNAL ",sygnal);
        ObjectCreate(ChartID(),"vline" + counter,OBJ_VLINE,0,iTime(Symbol(),PERIOD_M5,0),0);
        counter += 1;
      }
      if ((s>m)&&(s1<m1)&&(sygnal==1))
      {
      // Otwieramy zlecenie
         // ...
         //if(sygnal=0){
            ObjectCreate(ChartID(),"vline_signalzero" + counter,OBJ_VLINE,0,iTime(Symbol(),PERIOD_M5,0),0);
            ObjectSetInteger(ChartID(),"vline_signalzero" + counter,OBJPROP_COLOR,clrAqua);
         //}
         // resetuj sygnal 
         sygnal=0;
      }     
      LastActiontime=Time[0];     
   } 
   Print(sygnal); 
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   
  }
Funkcja iTime pobiera czas z danej świecy https://docs.mql4.com/series/itime
Linie pionowe są tutaj opisane https://docs.mql4.com/constants/objectc ... /obj_vline

Kris82
Stały bywalec
Stały bywalec
Posty: 34
Rejestracja: 11 lip 2012, 00:27

Re: Sygnał i potwierdzienie

Nieprzeczytany post autor: Kris82 »

Dziękuje za zainteresowanie się tematem. Wykreskowanie potwierdziło brak powstawania sygnałów tam gdzie powinny być. Dodatkowo odciąłem oś + i - dla dodatkowej przejrzystości.

Kod: Zaznacz cały

((s<m)&&(s1>m1)&&(s>0)&&(m>0))


W załączniku zaznaczyłem pomarańczowymi okręgami miejsca gdzie sygnały powinien występować a nie wystąpił.
Sprawdzałem na testerze model każdy tick. Nigdzie nie mogę dostrzec błędu w kodzie.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: Sygnał i potwierdzienie

Nieprzeczytany post autor: -rookie- »

Ale Twój warunek if ((s<m)&&(s1>m1)) robi coś innego https://images84.fotosik.pl/1022/d86a242f637406e3.png . Twój warunek powoduje że masz wejście na przecięciu tej czerwonej przerywanej linii na macd i wyjściu kiedy wartość pokazana na wykresie słupkowym schodzi pod tą linie. MACD w ustawieniach 30,52, 28. A tutaj na obrazku pokazujesz jakieś inne sygnały, które trzeba opisać inną instrukcją warunkową. Niestety tutaj kończy się moja pomoc, bo nie będę grzebał się tym, musisz sam dochodzić jak to zrobić. Poza tym zobacz że czerwona PIONOWA linia pojawia się dopiero potem na Twoim obrazku, czyli sygnał z Twojego warunku występuje dopiero po tym co zaznaczyłeś na pomarańczowo. Można zrobić tak że pierwszy MACD włącza sygnał czyli a kiedy sygnał jest aktywny jakiś bardziej wrażliwy macd w innych ustawieniach będzie robił wejścia. Sorki, ale ja nie mam czasu się w tym grzebać i dochodzić metodą prób i błędów jak to ma działać. Może ktoś inny wie jak wyciągnać ten sygnał z macd...

ahaa. Masz ustawiony argument applied price na PRICE_CLOSE. To może mieć znaczenie, ponieważ sygnał występuje dopiero PO ZAMKNIĘCIU ŚWIECY. Może to ma też wpływ na wynik https://docs.mql4.com/constants/indicat ... price_enum

Masz też ustawiony timeframe na 0, co znaczy że bierze period z testera który masz włączony a to jest np M15 heh. I możesz mieć u siebie sygnał na M5, a tego nie zobaczysz bo masz niezdefiniowany timeframe. Teraz masz

Kod: Zaznacz cały

double s=iMACD(NULL,0,30,52,28,PRICE_CLOSE,MODE_SIGNAL,0);
A może trzeba zdefiniować timeframe na M5 albo M1 https://docs.mql4.com/constants/chartco ... timeframes

Kod: Zaznacz cały

double s=iMACD(NULL,PERIOD_M5,30,52,28,PRICE_CLOSE,MODE_SIGNAL,0);

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Re: Sygnał i potwierdzienie

Nieprzeczytany post autor: Pierz Andrzej »

-rookie- pisze: ahaa. Masz ustawiony argument applied price na PRICE_CLOSE. To może mieć znaczenie, ponieważ sygnał występuje dopiero PO ZAMKNIĘCIU ŚWIECY. Może to ma też wpływ na wynik https://docs.mql4.com/constants/indicat ... price_enum

sorki ale muszę się wtrącić , PRICE_CLOSE nie jest tym o czym piszesz . nie ma nic wspólnego z warunkiem PO ZAMKNIĘCIU ŚWIECY . Mówi nam o tym że np średnia MA 14 liczona jest po cenach Close i tyle nic więcej

akttualna cena tez ma swoje Close[0] = Bid

jeżeli byś chciał osiągnąć PO ZAMKNIECIU SWIECY wtedy musiałbyś ustawić to w shift

Kod: Zaznacz cały

   
  double s=iMACD(NULL,0,30,52,28,PRICE_CLOSE,MODE_SIGNAL,1);
  double m=iMACD(NULL,0,30,52,28,PRICE_CLOSE,MODE_MAIN,1);
  double s1=iMACD(NULL,0,30,52,28,PRICE_CLOSE,MODE_SIGNAL,2);
  double m1=iMACD(NULL,0,30,52,28,PRICE_CLOSE,MODE_MAIN,2);
a kolegi Kris82 kod ma w tym momencie tak

Kod: Zaznacz cały

   
  double s=iMACD(NULL,0,30,52,28,PRICE_CLOSE,MODE_SIGNAL,0);
  double m=iMACD(NULL,0,30,52,28,PRICE_CLOSE,MODE_MAIN,0);
  double s1=iMACD(NULL,0,30,52,28,PRICE_CLOSE,MODE_SIGNAL,1);
  double m1=iMACD(NULL,0,30,52,28,PRICE_CLOSE,MODE_MAIN,1);
i dodatkowo do tego blokadę na 1 tick na otwarciu świecy
wiec na otwarciu świecy warunki mogą nie być spełnione a dopiero po jej zamknięciu stąd może pomijać sygnały
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Kris82
Stały bywalec
Stały bywalec
Posty: 34
Rejestracja: 11 lip 2012, 00:27

Re: Sygnał i potwierdzienie

Nieprzeczytany post autor: Kris82 »

Drodzy koledzy, Już straciłem nadzieje na pozytywne rozwiązanie mojego problemu.
Na całe szczęście znalazłem już gotowe rozwiązanie, jedynie co mi pozostaje to małe (kosmetyczne) modyfikacje.
To jest dokładnie to co chciałem, czyli
Oto kod:

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                        MACD Crossover Signal.mq4 |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2007, Robert Hill)"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red

double CrossUp[];
double CrossDown[];
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0, DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(0, 221);
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1, DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(1, 222);
   SetIndexBuffer(1, CrossDown);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
   int limit, i, counter;
   double MACD_Main, MACD_Signal, MACD_MainPrevious, MACD_SignalPrevious;
   double Range, AvgRange;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;

   limit=Bars-counted_bars;
   
   for(i = 0; i <= limit; i++) {
   
      counter=i;
      Range=0;
      AvgRange=0;
      for (counter=i ;counter<=i+9;counter++) {
         AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
      }
      Range=AvgRange/10;
       
      MACD_Main = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_MAIN, i);
      MACD_MainPrevious = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_MAIN, i+1);
      MACD_Signal = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_SIGNAL, i);
      MACD_SignalPrevious = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_SIGNAL, i+1);

      
      if ((MACD_Signal < MACD_Main) && (MACD_SignalPrevious > MACD_MainPrevious)) {
         CrossUp[i] = Low[i] - Range*0.5;
      }
      else if ((MACD_Signal > MACD_Main) && (MACD_SignalPrevious < MACD_MainPrevious)) {
         CrossDown[i] = High[i] + Range*0.5;
      }
   }
   return(0);
}

Czerwona strzałka sygnał, niebieska potwierdzenie a następnie wykonanie zlecenia

Ps. Tf był specjalnie ustawiony na 0.
Jeszcze raz dziękuje za pomoc, mam nadzieję że komuś się jeszcze przyda to rozwiązanie

ODPOWIEDZ