aktywnyinwestor.pl

Inwestycje na polskim rynku kapitałowym.

Filtr sygnałów kupna dla wybranych spółek w MQL4 - Sposób drugi

Tak jak obiecałem w poprzednim artykule, dzisiaj nauczymy się jak zrobić filtr sygnałów dla wszystkich spółek lub kontraktów terminowych nowym, o wiele szybszym sposobem, bez konieczności uruchamiania MT4 dla każdego waloru.

Tym razem sygnał będzie tworzony następująco (prośba jednego z komentarzy do poprzednich wpisów): jeżeli walor lub kontrakt przebije na CLOSE najwyższą wartość HIGH z poprzednich 20 sesji, generowany jest sygnał kupna.

Przejdźmy zatem do dzieła. Schemat działania:

1. Utworzenie listy walorów do zbadania i umieszczenie tejże listy w pliku tekstowym: dzięki temu skrypt MT4 nie będzie musiał być przekompilowywany za każdym razem, gdy chcemy zmienić zestaw walorów.

2. Otwarcie Metatrader’a z listą walorów do zbadania.

3. Uruchomienie skryptu, który zbada wszystkie walory lub kontrakty po kolei i zapisze wynik. Wynik może być zapisywany do konsoli, może być umieszczany na wykresach, lub może być zapisywany w pliku tekstowym. Wybrałem trzecie rozwiązanie, czyli zapis do pliku tekstowego.

ad 1) Utworzenie listy walorów do zbadania:

Sposoby są 2 - ręczne zapisywanie (wolne), lub za pomocą 1 linijki dzięki zainstalowanemu CygWin’owi (patrz poprzedni tutorial), przykładowo przez polecenie

ls -1 | grep “^A” > walory_do_sprawdzenia.txt (walory na literę A)
ls -1 > walory_do_sprawdzenia.txt (wszystkie walory)

Uwaga: z powodu ograniczenia architektury MT4 można wczytywać maksymalnie ok 120 walorów na raz.

listawalorow1

(screenshot konsoli - można powiekszyć przez kliknięcie)

ad 2) Otwarcie MetaTradera z listą walorów - wystarczy użyć poniższy skrypt:

#!/bin/bash

# Filtr sygnalow kupna 2
## Copyright (c) 2009, AktywnyInwestor.pl
## Skrypt
PLIKZWALORAMI="c:\\mt4\\experts\\files\\walory_do_sprawdzenia.txt"
WALORY=`cat $PLIKZWALORAMI | awk -F"1440.hst" '{ print $1 }'`

PROFILE_DIR="c:\\mt4\\profiles\\sygnaly\\"
PROGRAM_DIR="c:\\mt4\\"

## kopia tymczasowa plików w profilu sygnay
mv -f $PROFILE_DIR"chart01.chr" $PROFILE_DIR"chart01.bak"
mv -f $PROFILE_DIR"order.wnd" $PROFILE_DIR"order.bak"

cd $PROGRAM_DIR

licznik=1;

for i in $WALORY
do
 echo "Processing "$i
 echo $i",Daily (offline)" >> $PROFILE_DIR"order.wnd"
 CHARTNAME=`Printf "chart%02d.chr" $licznik`
 cat $PROFILE_DIR"\chart01.bak" | sed '2s/.*/symbol='"$i"'/' > $PROFILE_DIR$CHARTNAME
  let licznik=licznik+1;
 echo licznik = $licznik
 Printf "%02d" $licznik;
done

./terminal.exe terminal_sygnaly.ini

##  Cleanup
cd $PROFILE_DIR
rm -f *.chr
rm -f *.wnd
mv -f "chart01.bak" "chart01.chr"
mv -f "order.bak" "order.wnd"
cd $PROGRAM_DIR

Skrypt na pierwszy rzut oka może wyglądać na bardzo zawiły, jednak w rzeczywistości taki nie jest. Jego funkcjonalność jest podzielona na 3 części: pierwsza część przygotowuje sztuczne pliki dla profilu ’sygnaly’ (kolejny nieudokumentowany trick - dzięki temu nie trzeba ręcznie otwierać po kolei wszystkich walorów!). Druga część uruchamia MetaTrader’a i czeka na uruchomienie skryptu w MQL i wyłączenie MT4. Trzecia część przywraca stan profilu ’sygnaly’ do stanu poczatkowego.

ad 3) Skrypt w MQL4, który bada wszystkie akcje i kontrakty terminowe, które wpisaliśmy do listy w pliku ‘walory_do_zbadania.txt’:

//+------------------------------------------------------------------+
//|                                                   Sygnaly_v2.mq4 |
//|                             Copyright © 2009, AktywnyInwestor.pl |
//|                                    http://www.aktywnyinwestor.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, AktywnyInwestor.pl"
#property link      "http://www.aktywnyinwestor.pl"

#include <stderror.mqh>
#include <stdlib.mqh>

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   // Sprawdz dowolny warunek na podstawie biezacego waloru
   // przykładowo jeżeli Relative Strength Index < 20 mamy wyprzedanie
   string walor;
   string nazwa;
   string komunikat;
   string wynik;

   double najwyzszeHigh20Sesji;
   double dzisiejszeZamkniecie;

   int err;
   int uchwyt;
   int uchwyt2;

   uchwyt=FileOpen("walory_do_sprawdzenia.txt",FILE_READ);
   if(uchwyt<1)
   {
    err=GetLastError();
    Print("Blad(",err,"): ",ErrorDescription(err));
   }
   uchwyt2=FileOpen("Sygnaly_v2.txt",FILE_READ|FILE_WRITE);
   if(uchwyt2<1)
   {
    err=GetLastError();
    Print("Blad(",err,"): ",ErrorDescription(err));
   }   

   while (!FileIsEnding(uchwyt))
   {
    walor=FileReadString(uchwyt);
    nazwa=StringSubstr(walor, 0, StringLen(walor)-8);

    // sprawdzam najwyzsza cene High z poprzednich 20 sesji
    najwyzszeHigh20Sesji=iHigh(nazwa, PERIOD_D1, iHighest(nazwa,PERIOD_D1,MODE_HIGH,20,1));
    // jezeli cena z dzisiejszego Close byla wyzsza niz najwyzszy High z ostatnich 20 sesji mamy sygnal kupna!
    dzisiejszeZamkniecie=iClose(nazwa, PERIOD_D1, 0);

    if (dzisiejszeZamkniecie>najwyzszeHigh20Sesji) komunikat="NA CLOSE PRZEBITE HIGH 20-SESYJNE, SYGNAL KUPNA";
     else komunikat="BRAK SYGNALU KUPNA";

    wynik=StringConcatenate("Sygnal dla ", nazwa, " : HIGH20 = ", najwyzszeHigh20Sesji, " , DZISIEJSZE CLOSE = ", dzisiejszeZamkniecie, " wynik: ", komunikat); 

    FileSeek(uchwyt2, 0, SEEK_END);
    FileWrite(uchwyt2, wynik);
    FileFlush(uchwyt2);
   } 

   FileClose(uchwyt);
   FileClose(uchwyt2);
//----
   return(0);
  }
//+------------------------------------------------------------------+

Mam nadzieję, że komentarze w skrypcie ułatwiają zrozumienie kodu. Skrypt po kolei sprawdza HIGH z poprzednich 20 sesji i porównuje CLOSE dzisiejszego dnia dla każdej akcji lub kontraktu terminowego - jest uniwersalny. Mój przykładowy plik wynikowy ma postać:

Sygnal dla ASBIS : HIGH20 = 2.1 , DZISIEJSZE CLOSE = 1.78 wynik: BRAK SYGNALU KUPNA
Sygnal dla ASSECOBS : HIGH20 = 7.57 , DZISIEJSZE CLOSE = 6.7 wynik: BRAK SYGNALU KUPNA
Sygnal dla ASSECOPOL : HIGH20 = 59.25 , DZISIEJSZE CLOSE = 57.5 wynik: BRAK SYGNALU KUPNA
Sygnal dla ASSECOSLO : HIGH20 = 23.1 , DZISIEJSZE CLOSE = 22.05 wynik: BRAK SYGNALU KUPNA
Sygnal dla ASTARTA : HIGH20 = 21.4 , DZISIEJSZE CLOSE = 18 wynik: BRAK SYGNALU KUPNA
Sygnal dla ATLANTAPL : HIGH20 = 3.15 , DZISIEJSZE CLOSE = 3.06 wynik: BRAK SYGNALU KUPNA
Sygnal dla ATLANTIS : HIGH20 = 2.18 , DZISIEJSZE CLOSE = 1.98 wynik: BRAK SYGNALU KUPNA
Sygnal dla ATLASEST : HIGH20 = 3.58 , DZISIEJSZE CLOSE = 3.23 wynik: BRAK SYGNALU KUPNA
Sygnal dla ATM : HIGH20 = 5.58 , DZISIEJSZE CLOSE = 5.74 wynik: NA CLOSE PRZEBITE HIGH 20-SESYJNE, SYGNAL KUPNA
Sygnal dla ATMGRUPA : HIGH20 = 4.29 , DZISIEJSZE CLOSE = 3.9 wynik: BRAK SYGNALU KUPNA
Sygnal dla ATREM : HIGH20 = 12.86 , DZISIEJSZE CLOSE = 12.9 wynik: NA CLOSE PRZEBITE HIGH 20-SESYJNE, SYGNAL KUPNA
Sygnal dla AZOTYTARNOW : HIGH20 = 17.64 , DZISIEJSZE CLOSE = 17.03 wynik: BRAK SYGNALU KUPNA
Sygnal dla B3SYSTEM : HIGH20 = 2.83 , DZISIEJSZE CLOSE = 2.83 wynik: BRAK SYGNALU KUPNA
Sygnal dla BAKALLAND : HIGH20 = 3.79 , DZISIEJSZE CLOSE = 3.45 wynik: BRAK SYGNALU KUPNA
Sygnal dla BANKBPH : HIGH20 = 38.69 , DZISIEJSZE CLOSE = 37.81 wynik: BRAK SYGNALU KUPNA
Sygnal dla BANKIER.PL : HIGH20 = 8.11 , DZISIEJSZE CLOSE = 8.06 wynik: BRAK SYGNALU KUPNA
Sygnal dla BARLINEK : HIGH20 = 3.85 , DZISIEJSZE CLOSE = 3.54 wynik: BRAK SYGNALU KUPNA
Sygnal dla BBICAPNFI : HIGH20 = 1.81 , DZISIEJSZE CLOSE = 1.7 wynik: BRAK SYGNALU KUPNA
Sygnal dla BBIDEVNFI : HIGH20 = 0.41 , DZISIEJSZE CLOSE = 0.38 wynik: BRAK SYGNALU KUPNA
Sygnal dla BBIZENNFI : HIGH20 = 0.75 , DZISIEJSZE CLOSE = 0.6 wynik: BRAK SYGNALU KUPNA

Jest to oczywiście tylko przykład, można dowolnie formatować wyniki np. w taki sposób, aby można było je łatwo skopiować do arkusza kalkulacyjnego.

Poniżej sesja video z uruchomionego skryptu:

Opublikowano 2 rok, 11 mies. temu 20:57.

22 komentarzy

Filtr sygnałów kupna dla wybranych spółek w MQL4 - Sposób pierwszy

Dzisiaj bardziej technicznie: nauczymy się bardzo przydatnej rzeczy, a mianowicie jak zrobić filtr wybranych sygnałów kupna dla określonych spółek.

Często po analizie fundamentalnej i spekulacyjnej spółki korzystamy ze wskaźników analizy technicznej i na ich podstawie wybieramy moment wejścia - czyli zakupu akcji. Przeglądanie ręcznie wszystkich spółek po kolei jest bardzo czasochłonne i przydałoby się przynajmniej część pracy zlecić automatowi, który ‘za nas’ oceni, oczywiście wg naszych kryteriów, czy powinniśmy już zaalokować część posiadanej gotówki w akcje. Poniżej przedstawiam pierwszy sposób konstrukcji takiego automatu w programie MetaTrader w języku MQL4. Osoby korzystające z tego rozwiązania z pewnością będą o krok naprzód od inwestorów posługujących się wyłącznie ręcznym sprawdzaniem wszystkich spółek.

Wykorzystamy trick, który umożliwia uruchomienie dowolnego skryptu dla otwartego waloru po uruchomieniu MT4. Idea polega na uruchomieniu MetaTradera z uruchomionym skryptem, który sprawdzi wartości określonych wskaźników i zapisze wynik do pliku wyjściowego, a następnie zakończy działanie MetaTrader’a. Skrypt sterujący uruchamianiem Mt4 w pętli podmieni walor do sprawdzenia z uprzednio przygotowanej listy.

Potrzebujemy zrobić zatem 2 mechanizmy: pierwszy będzie podmieniał walor w profilu i uruchamiał program MT4, oraz drugi, który będzie sprawdzał wartości wskaźników AT i za ich pomocą generował sygnał kupna i zapisywał go do pliku wyjściowego.

Aby uruchomić MT4 z określonym walorem, utworzymy profil, który będzie przeznaczony wyłącznie do filtrowania sygnałów. W tym celu, po uruchomieniu MT4, otwórzmy jedną dowolną spółkę offline i zapiszmy profil pod nazwą ’sygnaly’.

profil

Po utworzeniu profilu, wychodzimy z MT4 i przegrywamy plik ‘terminal.ini’ z folderu /config/ do folderu głównego MT4, gdzie znajduje się terminal.exe i zmieniając jego nazwę na ‘terminal_sygnaly.ini’.

Mając powyższe ustawienia przygotujmy sobie listę walorów do sprawdzenia. Do przygotowania takiej listy i dalszej pracy skryptowej wykorzystuję środowisko Cygwin, które można za darmo pobrać z witryny www.cygwin.com (http://www.cygwin.com/setup.exe), a które dla osób nie zaznajomionych z tematem zawiera kopię narzędzi wzorowanych na środowisku linux. Dzięki temu osoby pracujące w systemach linux lub Mac OS będą w stanie łatwo przystosować skrypt dla swoich potrzeb.

Poniżej instalacja CygWin w kilku krokach:

Pierwsze kroki - wybór instalacji z internetu oraz folder docelowy - przykładowo c:\cygwin.

cygwin1

cygwin2

W polu ‘Default Text Type’ należy zmienić opcję Unix/binary (recommended) na DOS/text, unikniemy problemów związanych ze znakiem końca linii w systemie Windows.

cygwin3

cygwin4

Lista pakietów do zainstalowania - do naszych celów wystarczy, aby zainstalować pakiety podstawowe (wystarczy wcisnąć przycisk ‘Dalej’).

cygwin5

Po zainstalowaniu pakietu cygwin uruchamiamy go z Menu Start: Wszystkie Programy -> Cygwin -> Cygwin Bash Shell, naszym oczom powinna ukazać się powłoka systemowa Cygwin’a:

cygwin6

W pracy z Cygwinem nie będziemy uruchamiali środowiska w ten sposób, natomiast zmienimy ścieżkę systemową Windows tak, aby wskazywała także na folder z Cygwinem:

cygwin7

cygwin8

Po tej operacji uruchamiamy powłokę systemową Windows poleceniem Start->Uruchom, wpisujemy w pole z nazwą programu “cmd”. Od tego momentu polecenia Cygwin’a takie jak ‘ls’ ‘grep’ itp. powinny być dostępne z powłoki:

cygwin9

Aby przygotować listę walorów, można zastosować kombinację poleceń ls i grep, np.

ls c:\mt4\history\AlpariUK-Demo -1| grep “^P” > c:\mt4\walory_do_sprawdzenia.txt

(wpisanie wszystkich spółek zaczynających się na literę P)

lub np.

ls c:\mt4\history\AlpariUK-Demo -1 > c:\mt4\walory_do_sprawdzenia.txt

(wpisanie wszystkich spółek)

Oczywiście plik ‘walory_do_sprawdzenia.txt’ nie musi zawierać nazw w kolejności alfabetycznej, można dowolnie wycinać oraz wpisywać interesujące nas walory.
Mój przykładowy plik ma postać:


04PRO1440.hst
05VICT1440.hst
06MAGNA1440.hst
08OCTAVA1440.hst
14ZACH1440.hst
ABMSOLID1440.hst
ABPL1440.hst
ACE1440.hst
ACTION1440.hst
ADV.PL1440.hst
ADVADIS1440.hst
AGORA1440.hst
ALCHEMIA1440.hst
ALL_ORD1440.hst
ALMA1440.hst
ALUMAST1440.hst
AMBRA1440.hst
AMEX_MAJ1440.hst
AMICA1440.hst
AMPLI1440.hst
AMREST1440.hst

Następnie piszemy skrypt, który będzie z pliku ‘walory_do_sprawdzenia.txt’ wyciągał nazwy kolejnych walorów i podmieniał je w profilu ’sygnaly’. Jest to oczywiście sztuczka, której nie ma w żadnych instrukcjach MetaTradera:

Profil ’sygnaly’ zawiera w folderze 2 pliki: chart01.chr oraz order.wnd, które przechowują informacje o otwartych oknach oraz ustawieniach profilu. W pliku order.wnd przed uruchomieniem MT4 musi się znaleźć przykladowo:

AGORA,Daily (offline)

(ogólnie NAZWAWALORU,Daily (offline))

a w pliku chart01.chr interesuje nas druga linijka:

symbol=AGORA

gdzie pole po symbol= podmieniamy na dowolny kolejny symbol z pliku walory_do_sprawdzenia.txt

Kod skryptu umieszczam poniżej:

#!/bin/bash

# Filtr sygnalow kupna 1
# Copyright (c) 2009, AktywnyInwestor.pl 

pliki_cut=`cat walory_do_sprawdzenia.txt | awk -F"1440.hst" '{ print $1 }'`

PROFILE_DIR="c:\\mt4\\profiles\\sygnaly\\"
PROGRAM_DIR="c:\\mt4\\"

cd $PROGRAM_DIR

for i in $pliki_cut
do
echo "Processing "$i
echo $i",Daily (offline)" > $PROGRAM_DIR\\order.wnd
rm -f $PROFILE_DIR\\*
cp -f $PROGRAM_DIR\\order.wnd $PROFILE_DIR
cat $PROFILE_DIR"\chart01.chr" | sed '2s/.*/symbol='"$i"'/' > $PROFILE_DIR"\chart02.chr"
mv -f $PROFILE_DIR"\chart02.chr" $PROFILE_DIR"\chart01.chr"
cd $PROGRAM_DIR
./terminal.exe terminal_sygnaly.ini
done

Mamy skrypt, który podmienia nazwy spółek dla profilu sygnaly, czas na napisanie skryptu w MQL4, który sprawdzi warunek kupna na podstawie zadanych kryteriów i wpisze wynik do pliku wynikowego:

//+------------------------------------------------------------------+
//|                                                  SygWriter_1.mq4 |
//|                             Copyright © 2009, AktywnyInwestor.pl |
//|                                    http://www.aktywnyinwestor.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, AktywnyInwestor.pl"
#property link      "http://www.aktywnyinwestor.pl"

#include <stderror.mqh>
#include <stdlib.mqh>

#import "user32.dll"
   void     keybd_event(int bVk,int bScan,int dwFlags,int dwExtraInfo);
#import

void killTerminal() {
     keybd_event (18, 0, 0, 0);     keybd_event (115, 0, 0, 0);
     keybd_event (18, 0, 2, 0);     keybd_event (115, 0, 2, 0);
}

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   // Sprawdz dowolny warunek na podstawie biezacego waloru
   // przykładowo jeżeli Relative Strength Index < 20 mamy wyprzedanie
   string wynik;
   string wyprz;
   double sygnal;
   int err;

   // Odczytaj wartosc RSI
   sygnal=iRSI(NULL,PERIOD_D1,14,PRICE_CLOSE,0);

   // Sprawdz warunek wyprzedania
   if (sygnal<20) wyprz="WALOR WYRZEDANY, SYGNAL KUPNA";
    else wyprz="BRAK SYGNALU KUPNA";

   // Zapisz wynik do pliku
   int uchwyt;
   uchwyt=FileOpen("sygnaly.txt",FILE_READ|FILE_WRITE);
   if(uchwyt<1)
   {
    err=GetLastError();
    Print("Blad(",err,"): ",ErrorDescription(err));
   }   

   wynik=StringConcatenate("Sygnal dla walora ", Symbol(), " : RSI = ", sygnal, " , ", wyprz); 

   FileSeek(uchwyt, 0, SEEK_END);
   FileWrite(uchwyt, wynik);
   FileFlush(uchwyt);
   FileClose(uchwyt);
   killTerminal();
//----
   return(0);
  }
//+------------------------------------------------------------------+

Do prawidłowego działania skryptu należy za pomocą menu Opcje zakładka Strategie (CTRL + O), ustawić w MT4 import dll:

importdll

Skoro wszystko zostało już przygotowane, jesteśmy gotowi do przeprowadzenia testu. Skrypt wywolujemy korzystając z polecenia ‘bash filtr1.sh’, w trakcie jego działania w konsoli powinniśmy otrzymać kolejno nazwy sprawdzany spółek, np.:


Processing PAGED
Processing PAMAPOL
Processing PANOVA

podczas pracy skryptu zobaczymy uruchamianie i wyłączanie MetaTradera, jest to nieco czasochłonne, więc można w oczekiwaniu na wyniki odejść od komputera np. na herbatę.

Po zakończeniu skryptu wyniki mają postać:

Sygnal dla walora PAGED : RSI = 81.2505 , BRAK SYGNALU KUPNA
Sygnal dla walora PAMAPOL : RSI = 54.618 , BRAK SYGNALU KUPNA
Sygnal dla walora PANOVA : RSI = 57.7409 , BRAK SYGNALU KUPNA
Sygnal dla walora PBG : RSI = 66.4854 , BRAK SYGNALU KUPNA
….

Oczywiście sam sposób generowania sygnału zakupu należy traktować wyłącznie jako przykład.

Już wkrótce podam drugi sposób, który został wymyślony po zaimplementowaniu sposobu powyżej, a który nie wymaga wielokrotnego uruchamiania MT4.

Opublikowano 2 rok, 11 mies. temu 21:47.

7 komentarzy

Psychologia inwestowania

Dzisiaj mały przerywnik: “Psychologia inwestowania”, czyli ostrzeżenie: co może się stać, gdy rynek nie idzie w naszą stronę. Walka z rynkiem oczywiście bardzo wpływa na nasze emocje i sztuką jest czasem utrzymać nerwy na wodzach. Pamiętajmy o trzymaniu się własnego planu gry, oraz o tym, że aktywny inwestor wcale nie oznacza nadpobudliwego inwestora.


Opublikowano 2 rok, 11 mies. temu 13:00.

Dodaj komentarz

Debiuty GPW - wykres wspomagany MQL

Witam na pierwszym tutorialu poświęconym programowaniu w języku MQL na platformie MetaTrader.

Język MQL jest językiem zaprojektowanym specjalnie w celu ułatwienia analizy danych walutowych forex i kontraktów terminowych. Dla większości osób zapewne jest to całkowita abstrakcja, więc nie będziemy zagłębiać sie w każdą funkcję API. Nie zamierzam opisywać całego języka MQL, a raczej przedstawiać sposoby realizacji pomysłów, jakie nasuwają się podczas analizy spółek giełdowych.

Dzisiejszy tutorial ma nazwę ‘Debiuty GPW - wykres wspomagany MQL’:

Ostatnio postanowiłem bliżej przyjrzeć się debiutom spółek na GPW. Na początek chciałem sprawdzić, jak na debiut wpływa główny trend na giełdzie. Aby to zrobić, dążyłem do wyświetlenia nazwy wszystkich debiutów spółek na wykresie, uzyskując ostateczny efekt jak poniżej:

debiutylarge

debiutysmall

Aby osiągnąć cel, na początek potrzebujemy uzyskać daty interesujących nas debiutów. Wszystkie debiuty znajdują się na oficjalnej stronie internetowej GPW. Wybrałem wszystkie debiuty w 2008 r. i na postawie tabeli umieszczonej na stronie debiuty GPW utworzyłem plik zawierający w poszczególnych kolumnach nazwę spółki, datę debiutu, cenę emisyjną, wartość emisji, wartość oferty, ceny na zamknięcie w dniu debiutu za akcje lub cenę na zamknięcie w dniu debiutu dla PDA. Fragment pliku poniżej:

1;Atlas Estates Limited;2008.02.12;14,32;0,00;0,00;16,00;
2;Optopol Technology;2008.02.19;20,00;66 000 000;66 000 000; ;26,81
3;ZM Herman;2008.02.28;1,80;1 905 249,6;1 905 249,6; ;1,91
4;Skyline Investment;2008.03.18;9,00;18 000 000;18 000 000; ;8,55
5;Power Media;2008.03.20;5,00;7 000 000,00;7 000 000,00; ;5,00
6;Trakcja Polska;2008.04.01;4,00;120 000 000,00;160 000 000,00;4,92;4,94
7;Wojas;2008.04.02;9,50;25 428 251,00;25 428 251,00; ;8,88
8;Hardex;2008.04.03;100,00;9 614 300,00;9 614 300,00; ;99,00 ...

Dla zainteresowanych plik w całości znajduję się TUTAJ: debiuty.

Mając plik zawierający potrzebne nam dane, czyli w tym przypadku nazwę spółki i datę debiutu (resztę danych na razie pomijamy) należy nanieść nazwy spółek na wykres. Aby to zrobić, napiszemy SKRYPT MQL4, który automatycznie pobierze nazwy spółek i daty debiutów i umieści je na wykresie. Aby napisać skrypt, w głównym oknie MT4 wciskamy przycisk F4, który przeniesie nas do edytora plików MQL: MetaEditor’a. W MetaEditorze wybieramy opcję Plik->Nowy->Skrypt, co uruchomi Wizarda Doradcy Eksperckiego:

wizard1

wizard

Wizard tworzy za nas automatycznie szkielet skryptu w języku MQL i wyświetla go na ekranie. Ponieważ szkielet skryptu jest już gotowy, wpisujemy nasz skrypt wyświetlający nazwy debiutów GPW na wykresie WIG20:

//+------------------------------------------------------------------+
//|                                                   debiutyGPW.mq4 |
//|                             Copyright © 2009, AktywnyInwestor.pl |
//|                                    http://www.aktywnyinwestor.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, AktywnyInwestor.pl"
#property link      "http://www.aktywnyinwestor.pl"

#include <stderror.mqh>

void init()
  {
   Print("Skrypt debiuty GPW");
   ObjectsDeleteAll();
   return (ERR_NO_ERROR);
  }

void deinit()
  {
   return (ERR_NO_ERROR);
  }
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
   // zmienne lokalne
   datetime data;
   int      idx;
   int      delta;
   int      plik;
   string   nazwaWaloru;
   string   dataDebiutu;

   // otwarcie pliku z danymi debiutów
   plik=FileOpen("debiuty2008.txt", FILE_CSV|FILE_READ);

   if(plik>0) // jeżeli plik istnieje
   {
    while(!FileIsEnding(plik)) // czytaj az do konca pliku
    {
     Print(FileReadString(plik)); // pierwsza wartość to LP. do pominięcia
     nazwaWaloru = FileReadString(plik);
     dataDebiutu = FileReadString(plik);

     while ((!FileIsLineEnding(plik)) &amp;amp;&amp;amp; (!FileIsEnding(plik))) // resztę pól w linii pomijamy
     {
      FileReadString(plik);
     }

    Print(nazwaWaloru); // wypisz na konsoli nazwę waloru
    Print(dataDebiutu); // wypisz na konsoli datę debiutu

    // konwersja czasu z formatu String na format datetime
    data = StrToTime(dataDebiutu);

    // uzyskaj indeks swieczki z danego dnia
    idx = iBarShift("WIG20_", PERIOD_D1, data);

    // oblicz przesuniecie nazwy wzgledem High dnia + 200px
    delta = iHigh("WIG20_", PERIOD_D1, idx) + 200;

    if(!ObjectCreate(nazwaWaloru, OBJ_TEXT, 0, data, delta))
    {
     Print("Blad! nie moge utworzyc obiektu tekstowego. Kod bledu #", GetLastError());
     return(0);
    } else { // jezeli obiekt zostal utworzony, wpisz tekst i nadaj atrybuty tekstu
     ObjectSetText(nazwaWaloru, nazwaWaloru+dataDebiutu);
     ObjectSet(nazwaWaloru, OBJPROP_ANGLE, 90);
     ObjectSet(nazwaWaloru, OBJPROP_COLOR, Red);
     ObjectSet(nazwaWaloru, OBJPROP_FONTSIZE, 8);
    }
   }
  // zamknij plik
  FileClose(plik);
  }
  ObjectsRedraw();
  return(ERR_NO_ERROR);
  }
//+------------------------------------------------------------------+
 

Z pewnością na pierwszy rzut oka wygląda to jak ‘czarna magia’, więc rozbijam skrypt na czynniki pierwsze. Na początku skryptu znajdują się nagłówek z wygenerowanymi danymi dotyczącymi autora oraz praw autorskich:

 //+------------------------------------------------------------------+
//|                                                   debiutyGPW.mq4 |
//|                             Copyright © 2009, AktywnyInwestor.pl |
//|                                    http://www.aktywnyinwestor.pl |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, AktywnyInwestor.pl"
#property link      "http://www.aktywnyinwestor.pl" 

Następnie mamy dyrektywę include, która jest potrzebna do zaimportowania kodu błędów, tak aby zamiast mało znaczącego return 0 można było wstawić ERR_NO_ERROR.

#include <stderror.mqh>

Następnie mamy 2 funkcje: init() oraz deinit() wołane przy starcie i zabijaniu skryptu, nie robimy tu nic szczególnego oprócz zabicia wszystkich zbędnych obiektów, które mogą znajdować się na wykresie:

void init()
  {
   Print("Skrypt debiuty GPW");
   ObjectsDeleteAll();
   return (ERR_NO_ERROR);
  }

void deinit()
  {
   return (ERR_NO_ERROR);
  } 

Poniżej znajduje się funkcja start(), która jest sercem naszego skryptu, wykonują się w niej wszystkie operacje istotne dla działania skryptu. Na początku funkcji mamy zdefiniowane kilka zmiennych: datę w formacie rozpoznawanym przez MetaTradera, indeks świeczki nad którą narysować nazwę walora, przesunięcie względem świeczki, uchwyt pliku (unikalną liczbę która pozwala na rozpoznanie czy plik jest otwarty), nazwę walora i datę debiutu w formacie String, które wycinamy z pliku debiuty.

   // zmienne lokalne
   datetime data;
   int      idx;
   int      delta;
   int      plik;
   string   nazwaWaloru;
   string   dataDebiutu; 

Po zadeklarowaniu zmiennych otwieram plik z debiutami i wczytuję je kolejno do systemu:

  // otwarcie pliku z danymi debiutów
   plik=FileOpen("debiuty2008.txt", FILE_CSV|FILE_READ);

   if(plik>0) // jeżeli plik istnieje
   {
    while(!FileIsEnding(plik)) // czytaj az do konca pliku
    {
     Print(FileReadString(plik)); // pierwsza wartość to LP. do pominięcia
     nazwaWaloru = FileReadString(plik);
     dataDebiutu = FileReadString(plik);

     while ((!FileIsLineEnding(plik)) &amp;amp;&amp;amp; (!FileIsEnding(plik))) // resztę pól w linii pomijamy
     {
      FileReadString(plik);
     }

    Print(nazwaWaloru); // wypisz na konsoli nazwę waloru
    Print(dataDebiutu); // wypisz na konsoli datę debiutu

    // konwersja czasu z formatu String na format datetime
    data = StrToTime(dataDebiutu); 

Aby narysować nazwę walora nad dobrą świeczką, musimy znaleźć jej indeks i obliczyć przesunięcie, tak aby nazwa nie nakładała się na wykres, a była wyświetlana nad nim:

// uzyskaj indeks swieczki z danego dnia
    idx = iBarShift("WIG20_", PERIOD_D1, data);

// oblicz przesuniecie nazwy wzgledem High dnia + 200px
    delta = iHigh("WIG20_", PERIOD_D1, idx) + 200;
 

Po tych spektakularnych obliczeniach wstawiamy nazwę na wykres, obracamy ją o 90 stopni w prawo i kolorujemy na czerwono:

   if(!ObjectCreate(nazwaWaloru, OBJ_TEXT, 0, data, delta))
    {
     Print("Blad! nie moge utworzyc obiektu tekstowego. Kod bledu #", GetLastError());
     return(0);
    } else { // jezeli obiekt zostal utworzony, wpisz tekst i nadaj atrybuty tekstu
     ObjectSetText(nazwaWaloru, nazwaWaloru+dataDebiutu);
     ObjectSet(nazwaWaloru, OBJPROP_ANGLE, 90);
     ObjectSet(nazwaWaloru, OBJPROP_COLOR, Red);
     ObjectSet(nazwaWaloru, OBJPROP_FONTSIZE, 8);
    }

Po przeliczeniu wszystkich debiutów odświeżamy wykres i zamykamy plik

 // zamknij plik
  FileClose(plik);
  }
  ObjectsRedraw();
  return(ERR_NO_ERROR);
  }

I to wszystko. Jeżeli i tak za pierwszym razem mało z tego zrozumiałeś, nie przejmuj się, nie od razu Rzym zbudowano. Jak zwykle będę czekał na komentarze.

Opublikowano 2 rok, 11 mies. temu 00:51.

6 komentarzy

AktywnyInwestor.pl na światłowodzie!

Miło mi powiadomić, że zakończyło się przenoszenie serwisu http://AktywnyInwestor.pl na szybkie łącze symetryczne o prędkości 100Mb/s. Mam nadzieję, że wprowadzi to nową jakość użytkowania serwisu.

Jeżeli występują jakikolwiek problemy natury technicznej, proszę wpisać krótki opis problemu, system operacyjny i nazwę przeglądarki, w ten sposób będzie łatwiej zdiagnozować i poprawić problem.

W przyszłości stopniowo będą wprowadzane zaplanowane zmiany dotyczące wyglądu i funkcjonalności, które sugerowali użytkownicy.

Dziękuję za pozytywny odzew oraz za konstruktywne uwagi.

Opublikowano 3 rok temu 16:04.

5 komentarzy

Przerwa w działaniu serwisu

Z powodu awarii macierzy dyskowej serwera, na którym umieszczony jest serwis AktywnyInwestor.pl, nie było dostępu do serwisu przez okres dwóch dni. Wkrótce nastąpi zmiana firmy hostingowej. Przepraszam za trudności z połączeniem.

Opublikowano 3 rok temu 12:56.

1 komentarz

WIG20lev i WIG20short - po co to komu?

Nie wiem, czy wszyscy zdążyli zauważyć - od kilku dni, a konkretnie od 4 maja br. pojawiły się 2 nowe indeksy giełdowe GPW - WIG20lev i WIG20short. W kilku zdaniach, WIG20short kształtuje się w sposób odwrotny do indeksu WIG20 tzn. przy spadku WIG20 o 10 pkt. WIG20short rośnie o 10 pkt. Indeks WIG20lev podąża zgodnie z kierunkiem WIG20, ale wzrost WIG20 o 10 pkt powoduje wzrost WIG20lev o 20 pkt. Można zapytać - po co to komu?

Jeżeli nie wiadomo o co chodzi, to chodzi o pieniądze. I zgadza się, właśnie te nowe indeksy powstały po to, aby można było na nich zarabiać. Wig20short został utworzony, aby instytucje finansowe mogły tworzyć nowe struktury (certyfikaty strukturyzowane) oparte na tym instrumencie, czyli jeżeli wartość Wig20short rośnie, to zarabiamy przy spadkach indeksu WIG20.

Natomiast Wig20lev…no właśnie, ma ktoś może pomysł? Komu jest potrzebne lewarowanie na kontraktach WIG20? Zapraszam do komentarzy.

Opublikowano 3 rok temu 20:31.

2 komentarzy

Dane MT4 World - Indeksy Światowe

Nowość!! Z dniem dzisiejszym w serwisie http://AktywnyInwestor.pl wprowadzone zostały codzienne dane EOD w formacie MT4 dla indeksów giełdowych z całego świata - Dane MT4 World!

nasdaq

b-shares

nikkei

1063216

Dane obejmują:

  • All Ord Austral.
  • AMEX Major
  • B-Shares Shanghai
  • BOVESPA SaoPaulo
  • Buenos Aires
  • Budapest BUX
  • Paris CAC 40
  • Frankfurt DAX
  • DJ Industrial
  • DJ Trans Aver
  • DJ Util Aver
  • EOE Amsterdam
  • London FT-SE
  • Hang Seng H.Kong
  • Internet US
  • Mexic IPC
  • NASDAQ US
  • RUSSEL 2000
  • SASE Select.Ind
  • SMI Swiss
  • S&P 500 US
  • TSE-300 Toronto
  • NIKKEI 225 Tokyo
  • TOPIX Tokyo

Dla zainteresowanych - zebrane kilka słów o indeksach:

All Ord Austral. - All Ordinaries Index (AOI) - najstarszy indeks giełdowy z Australii, kapitalizacja indeksu odpowiada ok. 95% wartości akcji na giełdzie ASX (Australian Securities Exchange)

AMEX Major (XMI) - główny indeks giełdowy American Stock Exchange, składający się z 20 największych spółek (blue-chipów), zaprojektowany jako lustrzana kopia DJIA, obliczany od 1983r.

B-Shares Shanghai - indeks giełdy w Szanghaju. B-Shares oznacza, że akcje są notowane w walucie obcej (dolarach amerykańskich), w przeciwieństwie do A-Shares notowanych w jenach. Akcje typu A mogą być nabywane wyłącznie przez inwestorów chińskich (rezydentów)

BOVESPA (BOlsa de Valores dE São PAulo) - indeks  giełdy w Sao Paulo. W jego skład wchodzą akcje 50 spółek. Indeks Bovespa składa się z portfela akcji przedsiębiorstw, których obrót stanowi 80% obrotu giełdowego w czasie ostatnich 12 miesięcy i które brały udział w co najmniej 80% sesji giełdowych. Aby zapewnić odpowiednią reprezentatywność, skład indeksu jest rewidowany co trzy miesiące.

Buenos Aires  (Merva) - to główny indeks na giełdzie w Buenos Aires (Buenos Aires Stock Exchange); Bazą jest 30 czerwiec 1986 = 0.01 pesos.

Budapest BUX (Budapesti Értéktőzsde) - indeks giełdowy akcji spółek notowanych na Giełdzie Papierów Wartościowych w Budapeszcie .

Paris CAC 40  (Cotation Assistée en Continu – Notowania Ciągłe) – francuski indeks akcji, benchmark giełdy Euronext. Indeks ten skupia 40 najsilniejszych spółek spośród 100 o najwyższej kapitalizacji na Giełdzie Paryskiej (Bourse de Paris). CAC 40 wystartował 31 grudnia 1987 roku z poziomu 1000 punktów.

Frankfurt DAX - (Deutscher Aktienindex) - jest najważniejszym niemieckim indeksem akcji. Jest tzw. indeksem wynikowym (ang. Performanceindex), co oznacza, że bierze pod uwagę nie tylko wzrost cen akcji, ale i również wzrost kapitału poprzez wypłatę dywidendy.

DJ Industrial (Dow Jones Industrial Average DJIA) – to jeden z najważniejszych indeksów akcji spółek notowanych na Giełdzie Papierów Wartościowych w Nowym Jorku (New York Stock Exchange) i Nasdaq. Indeks ten został stworzony przez Charlesa Dowa i statystyka Edwarda Jonesa. Indeks Dow Jones jest najstarszym działającym indeksem akcji w Stanach Zjednoczonych. Obecnie składa się on z 30 największych amerykańskich przedsiębiorstw.

DJ Trans portAver (Dow Jones Transportation Average DJIA) - („średnia transportowa”),  założony 3 lipca 1884 roku .

DJ Util Aver (Dow Jones Utilities Average) - średnia ze spółek użyteczności publicznej

EOE (Amsterdam European Options Exchange Index AEX) - indeks 25 wiodących spółek holenderskiej giełdy, założony w 1983r.

London FT-SE (Financial Times Stock Exchange) – indeks akcji spółek giełdowych notowanych na giełdzie w Londynie (London Stock Exchange). Indeks obejmuje 100 największych spółek, uznaje się go za barometr brytyjskiej gospodarki. Obok indeksów DAX i CAC 40 należy on do największych w Europie. Spółki wchodzące w skład indeksu stanowią około 80% kapitalizacji giełdy LSE.

Hang Seng H.Kong - (HSI) to indeks akcji spółek notowanych na giełdzie w Hongkongu (Hong Kong Stock Exchange). Reprezentuje on zmianę kursów akcji 33 największych pod względem kapitalizacji przedsiębiorstw. Spółki wchodzące w skład indeksu stanowią około 70% kapitalizacji giełdy.

Internet US - to indeks dot-comów obliczany przez Bloomberg od 31 grudnia 1998r. (początek boomu spółek internetowych), wlicza się do niego firmy o kapitalizacji minimum 250 mln dolarów, m.in. Yahoo!, AOL,  eBay, Amazon.com

Mexico IPC - (Indice de Precios y Cotizaciones) to indeks giełdowy Meksykańskiej Giełdy Papierów Wartościowych (Bolsa Mexicana de Valores). W jego skład wchodzi 35 spółek.

NASDAQ US - (National Association of Securities Dealers Automated Quotations) - indeks pozagiełdowego, regulowanego rynku akcji w Stanach Zjednoczonych, z filiami w Kanadzie i Japonii, zorganizowany i nadzorowany przez National Association of Securities Dealers. Wbrew rozpowszechnionym opiniom, NASDAQ nie jest giełdą w ogólnym znaczeniu tego słowa, lecz jest raczej rozproszonym, elektronicznym systemem handlu akcjami. NASDAQ został uruchomiony 8 lutego 1971.

RUSSEL 2000 -podindeks indeksu RUSSEL 3000, tworzony przez firmę Russell Investments, zawiera benchmark 2000 amerykańskich spółek o małej kapitalizacji.

SASE Select Index (Santiago Stock Exchange) - indeks giełdy w Chile

SMI Swiss -  indeks giełdowy spółek notowanych na Szwajcarskiej Giełdzie Papierów Wartościowych (Swiss Exchange). W skład indeksu może wchodzić maksymalnie 30 spółek. Obecnie indeks obejmuje akcje 26 spółek. Swiss Market Index wystartował 30 czerwca 1988 roku z poziomu 1.500 punktów.

S&P 500 US - indeks, w skład którego wchodzi 500 firm o największej kapitalizacji, notowanych na New York Stock Exchange i Nasdaq, są to głównie firmy amerykańskie. S&P 500 wchodzi w skład szerszego indeksu - S&P 1500 oraz S&P Global 1200.
TSE-300 Toronto -  indeks giełdowy 300 największych spółek notowanych na giełdzie w Toronto.

NIKKEI 225 Tokyo - (jap. 日経平均株価 Nikkei heikin kabuka) to indeks akcji spółek notowanych na giełdzie w Tokio. Nikkei należy do najważniejszych indeksów giełdowych w Azji. Od 1971 roku jest codziennie wyliczany przez dziennik Nihon Keizai Shimbun. Indeks obejmuje 225 największych spółek. Raz w roku dokonuje się rewizji składu indeksu.

TOPIX Tokyo - drugi obok Nikkei 225 ważny indeks giełdowy spółek notowanych na giełdzie w Tokio, obrazuje wszystkie spółki notowane na rynku podstawowym (ok. 1645 przedsiębiorstw). Indeks przechodzi obecnie transformację z systemu opartego na wycenie firmy w oparciu o ilość dostępnych akcji (float) na system wyceny oparty o liczbę akcji w wolnym obrocie (free float).

Uwaga: Dane światowe źródłowe aktualizowane są po sesji w USA o godz. 23:59, zatem dane MT4 World będą uaktualniane w serwisie 2 razy w ciągu doby – po sesji europejskiej i po sesji amerykańskiej po godz. 00:00, w ten sposób rano będzie dostęp do sesji USA z dnia poprzedniego.

Opublikowano 3 rok temu 22:09.

2 komentarzy

Dopasowanie skali wykresu

Domyślnie w MT4 skala wykresu jest dopasowywana automatycznie do wahań kursu waloru w wyświetlanym przedziale, na podstawie wartości minimalnej i maksymalnej kursu. Z reguły jest to ustawienie dobre, ale tylko dla badanego przedziału. Czasem istnieje konieczność ustawienia skali stałej, tak aby podczas przesuwania wykresu skala nie zmieniała się. W tym celu należy za pomocą klawisza F8 przejść do menu i przestawić skalę na żądaną.

skala

Wartości skali ‘Fixed maximum’ oraz ‘Fixed minimum’ to wartości wyliczone automatycznie przez terminal MT4 na podstawie widocznego okna. Po zaznaczeniu opcji ‘Skala’ wartości te ograniczają oś Y (ceny) podczas przewijania wykresu np. strzałkami Lewo-Prawo, lub F12 - SHIFT+F12. Jeżeli przykładowo chcemy uzyskać skalę obejmującą większy przedział czasu, możemy przybliżyć lub oddalić wykres za pomocą klawiszy + i -, a następnie skorzystać z automatycznie wyliczonych wartości, lub wpisać ręcznie żądane minimum i maksimum. Przykład video poniżej.

Opublikowano 3 rok temu 22:03.

2 komentarzy

Długi weekend majowy

Zbliża się długi weekend, zatem życzę wszystkim udanego wypoczynku. Warto odpocząć na łonie natury i nabrać sił przed kolejnymi inwestycjami.

Opublikowano 3 rok temu 16:51.

Dodaj komentarz