Wszystkie pytania dozwolone początkujących programistów

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
Pablo90
Pasjonat
Pasjonat
Posty: 1215
Rejestracja: 10 cze 2007, 15:36

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: Pablo90 »

Magic number to argument funkcji OrderSend(), musisz go ustawić na inną wartość niż 0 (taki magic number mają ustawione zlecenia ręczne) i inną niż inne EA działające w tej chwili. Później przed obsługą zlecenia sprawdzasz czy magic number się zgadza.

Kod: Zaznacz cały

if (OrderMagicNumber == magicNumber) {
// tu następuje obsługa danego zlecenia
}
magicNumber to ustawiony przez Ciebie magic number.

Inwestor411
Uczestnik
Uczestnik
Posty: 1
Rejestracja: 28 cze 2016, 04:37

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: Inwestor411 »

Witam,

Jestem bardzo początkujący w kwestii programowania, mam wiele pytań ale zacznę od następującego:

mam pomysl na bardzo prostego robota i m. in. chcialbym zapytac jak zapisac warunek polegajacy na tym ze jak jakakolwiek otwarta transakcja buy zakonczy sie poprzez take profit to wszystkie zlecenia oczekujace buylimit zostana anulowane.

Z gory dziekuje za odp.

GdzieMoje300Baniek
Uczestnik
Uczestnik
Posty: 4
Rejestracja: 06 cze 2016, 21:46

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: GdzieMoje300Baniek »

Nie wiem czy ktoś tu jeszcze zagląda, ale wrzucę pytanie, może dostanę odpowiedź.

Jestem w bardzo wczesnej fazie nauki mql więc robię jakieś proste próby i natknąłem się na mały problem.

Założenia są takie:

1* Sygnał zakupu ze Stocha

kline = iStochastic(NULL, Period(), 20, 8, 3, MODE_SMA, 0, MODE_MAIN, 0);
dline = iStochastic(NULL, Period(), 20, 8, 3, MODE_SMA, 0, MODE_SIGNAL, 0);

2* kupno tylko kiedy krótka średnia jest powyżej długiej średniej

shortEma = iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,0);
longEma = iMA(NULL,0,30,0,MODE_EMA,PRICE_CLOSE,0);,

if(isCrossed == 1 && shortEma>longEma)

3* sprzedaż tylko kiedy krótka średnia jest poniżej długiej średniej

if(isCrossed == 2 && shortEma<longEma)

4* zamknięcie pozycji na tylko na TP lub SL bez dodatkowych sygnałów.

W efekcie dostaję transakcje z których część jest ok, a część zawarta jest przy nie spełnionym jednym z warunków. Czyli następuje przecięcie linii, które powinno dać sell, ale w efekcie wychodzi buy, pewnie dlatego, że krótka średnia jest powyżej długiej. Czyli wg mnie w tym momencie w ogóle nie powinno być transakcji. Zauważyłem też, że zawierane są transakcje w momentach kiedy wcale nie ma przecięć. Załączam kod + przykładowe screeny. Jest to M5 dla EURUSD w okresie 1.06 - 30.06 tego roku.

Czy ktoś naprostuje błąd w moim rozumowaniu bądź kodzie?
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

JAREK67
Maniak
Maniak
Posty: 2143
Rejestracja: 13 lip 2006, 11:21

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: JAREK67 »

Sprawdzasz warunki na bieżącej świecy. Wtedy wszystkie kombinacje są możliwe i takie właśnie zagrania również. Zmień z "0" na "1" wtedy sygnały będą trochę późniejsze, ale za to zgodne z założeniami.

GdzieMoje300Baniek
Uczestnik
Uczestnik
Posty: 4
Rejestracja: 06 cze 2016, 21:46

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: GdzieMoje300Baniek »

Dzięki za zainteresowanie, ale spokojnie, spokojnie. Przypominam, że jestem jeszcze zielony i nie łapię wszystkie w lot ;)
Więc tak: po 1 to dlaczego tak jak jest to nie działa tak jak trzeba. Rozumiem, że z doświadczenia wiesz co działa lepiej, a co gorzej. Ale na pewno ma to jakieś uzasadnienie. Jesteś w stanie podpowiedzieć dlaczego pomimo prawidłowego zapisu logicznego funkcji nie robią tego czego można by się po nich spodziewać?

Masz może przykład podobnego programu gdzie warunek sprawdzany jest dla bieżącej świecy? Jestem jeszcze na etapie kiedy nie potrafię w lot przejść od pomysłu do realizacji i raczej bazuję na gotowcach, które staram się modyfikować. Wiem, że wymagam dużo, ale spodziewam się, że ktoś kto dużo programuje zawsze ma pod ręką jakieś banalne przykłady, które ilustrują ideę.

Zmień 0 na 1. Przepraszam, ale w tym momencie to zupełnie nie załapałem, bo taki parametr występuje w wielu miejscach.

PS: Widziałem twój filmik, który masz w stopce. Jeśli sam to zaprogramowałeś to robi wrażenie :)

JAREK67
Maniak
Maniak
Posty: 2143
Rejestracja: 13 lip 2006, 11:21

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: JAREK67 »

Podmień w kodzie ten fragment:

Kod: Zaznacz cały

      kline = iStochastic(NULL, Period(), 20, 8, 3, MODE_SMA, 0, MODE_MAIN, 1);
      dline = iStochastic(NULL, Period(), 20, 8, 3, MODE_SMA, 0, MODE_SIGNAL, 1);
      
      
      shortEma = iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,1);
      longEma = iMA(NULL,0,30,0,MODE_EMA,PRICE_CLOSE,1);
Teraz EA będzie sprawdzał warunki na świecy, która jest już zamknięta, czyli warunki będą już ustalone.
Jeśli chcesz szukać przecięć to nie możesz ich sprawdzać na świecach, które są w trakcie tworzenia.

GdzieMoje300Baniek
Uczestnik
Uczestnik
Posty: 4
Rejestracja: 06 cze 2016, 21:46

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: GdzieMoje300Baniek »

Dzięki! Wygląda na to, że teraz mam pożądany efekt. Nie zwróciłem uwagi na niuans opisany tutaj:
http://www.forexfactory.com/showthread.php?t=36225

a konkretnie:
"As far as I can tell, High/Low uses the following formula to calc %K:
100 x (Recent Close - Lowest Low*) / (Highest High* - Lowest Low*)
[* for the last N periods, where N is the %K parameter]

whereas Close/Close uses the following formula to calc %K:
100 x (Recent Close - Lowest Close*) / (Highest Close* - Lowest Close*)"

psk89
Stały bywalec
Stały bywalec
Posty: 48
Rejestracja: 21 cze 2016, 07:39

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: psk89 »

Witam,

Chciałem stworzyć swój własny custom indicator według tego wprowadzenia http://www.investopedia.com/university/ ... cators.asp

Wizard podczas tworzenia arkusza pyta mnie normalnie o nazwę parametry itp z tym, że narzuca mi wybór spośród OnCalculate gdzie ja oczekiwałem wygenerowania czegoś w stylu:

int init()
{
}

oraz int start()
{
}

a generuję mi coś takiego:

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                         chuj.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1;
//--- indicator buffers
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
no i nie wiem co dalej robić by pisać swój wskaźnik.
Proszę o sugestię jak to roziązać

JAREK67
Maniak
Maniak
Posty: 2143
Rejestracja: 13 lip 2006, 11:21

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: JAREK67 »

na początek zmień nazwę, bo to cudzego "ch..a" to raczej nikt ręki nie przyłoży. :oops:

psk89
Stały bywalec
Stały bywalec
Posty: 48
Rejestracja: 21 cze 2016, 07:39

Re: Wszystkie pytania dozwolone początkujących programistów

Nieprzeczytany post autor: psk89 »

masakra nie zauważyłem jak to wklejałem. Bardzo przepraszam. Nie widzę opcji edycji postu :oops:

-- Dodano: 07 sie 2016, 14:09 --

Zmieniłem to ręcznie i kompilacja jest ok ale nie ukrywam, że chciałbym aby się to samo generowało.

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                        mk89.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot mojalinia
#property indicator_label1  "mojalinia"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         mojaliniaBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int Init()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,mojaliniaBuffer);
   SetIndexStyle(0,DRAW_LINE);
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
  int zliczoneBary=IndicatorCounted();
  if(zliczoneBary<0)
  {
  return(-1);
  }
  
  int pos = Bars - zliczoneBary - 1;
  double closePrice, openPrice, result;
  
  while(pos >= 0)
  {
  closePrice = Close[pos];
  openPrice  = Open[pos];
  
  result = closePrice - openPrice;
  
  mojaliniaBuffer[pos]= result;
  pos--;
  
  }

   return(0);
  }
//+------------------------------------------------------------------+
Wrzuciłem tego gotowca na platformę i tym oddzielnym okienku nic się nie wyrysowało.
Czy ma to związek z tym iż jest niedziela i giełda śpi?

-- Dodano: 08 sie 2016, 08:41 --

Witam,

Napisałem taki mały wskaźniczek lecz nie wiem dla czego działa tylko na jednej parze walutowej.

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                        jasiu.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot mojalinia
#property indicator_label1  "mojalinia"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         mojaliniaBuffer[];
extern int Period_MA1 = 8;
extern int Period_MA2 = 34;
extern int Period_MA3 = 80;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int Init()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,mojaliniaBuffer);
   SetIndexStyle(0,DRAW_LINE);
   
   ObjectCreate("ObjName", OBJ_LABEL, 0, 0, 0);
   ObjectSetText("ObjName","Siema",14, "Verdana", Red);
   ObjectSet("ObjName", OBJPROP_CORNER, 1);
   ObjectSet("ObjName", OBJPROP_XDISTANCE, 20);
   ObjectSet("ObjName", OBJPROP_YDISTANCE, 20);
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   double MA_1, MA_2, MA_3;
   
   MA_1 = iMA(NULL,0,Period_MA1,0,MODE_SMA,PRICE_CLOSE,0); 
   MA_2 = iMA(NULL,0,Period_MA2,0,MODE_SMA,PRICE_CLOSE,0);
   MA_3 = iMA(NULL,0,Period_MA3,0,MODE_SMA,PRICE_CLOSE,0);
   
   if( MA_1 > MA_2 && MA_1 > MA_3 && MA_2 > MA_3)
     { ObjectSetText("ObjName","UP Trend",14, "Verdana", Red);
     } else ObjectSetText("ObjName","Brak",14, "Verdana", Red);
   
   
   if( MA_1 < MA_2 && MA_1 < MA_3 && MA_2 < MA_3)
     { ObjectSetText("ObjName","DOWN Trend",14, "Verdana", Red);
     } else ObjectSetText("ObjName","Brak",14, "Verdana", Red);

   return(0);
  }
//+------------------------------------------------------------------+
Na innych parach również załączyłem ten plik i niestety nie działa :(

ODPOWIEDZ