Serwis Forex-nawigator.biz korzysta z plików cookies w celu realizacji usług i zgodnie z Polityką Plików Cookies.
Możesz określić warunki przechowywania lub dostępu do plików cookies w Twojej przeglądarce. [Zamknij tą informację]

Dzisiaj jest 24 wrz 2018, 00:49     Inwestuj z zaufanym, globalnym brokerem XM!



Sygnał i potwierdzienie

O jezykach programowania w platformach i nie tylko.
  • Autor
  • Wiadomość
Offline

Kris82

Stały bywalec

Stały bywalec

  • Posty: 28
  • Rejestracja: 11 lip 2012, 00:27

Sygnał i potwierdzienie

Nieprzeczytany post13 mar 2018, 15:51

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.
Zaloguj się (lub zarejestruj), aby zobaczyć pliki załączone do tego postu.
Online

-rookie-

Maniak

Maniak

  • Posty: 2400
  • Rejestracja: 13 kwie 2015, 19:00

Re: Sygnał i potwierdzienie

Nieprzeczytany post17 mar 2018, 22:17

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
Offline

Kris82

Stały bywalec

Stały bywalec

  • Posty: 28
  • Rejestracja: 11 lip 2012, 00:27

Re: Sygnał i potwierdzienie

Nieprzeczytany post20 mar 2018, 22:20

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.
Zaloguj się (lub zarejestruj), aby zobaczyć pliki załączone do tego postu.
Online

-rookie-

Maniak

Maniak

  • Posty: 2400
  • Rejestracja: 13 kwie 2015, 19:00

Re: Sygnał i potwierdzienie

Nieprzeczytany post21 mar 2018, 08:22

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);
Offline
Awatar użytkownika

Pierz Andrzej

Moderator

Moderator

  • Posty: 1828
  • Rejestracja: 02 lip 2006, 14:17
  • Lokalizacja: Kraków-Racławice
  • Pochwały: 99

Re: Sygnał i potwierdzienie

Nieprzeczytany post21 mar 2018, 09:02

-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
Offline

Kris82

Stały bywalec

Stały bywalec

  • Posty: 28
  • Rejestracja: 11 lip 2012, 00:27

Re: Sygnał i potwierdzienie

Nieprzeczytany post21 mar 2018, 22:24

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

Wróć do Programowanie

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 4 gości