Wszystkie pytania dozwolone początkujących programistów

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 4944
Rejestracja: 30 lip 2019, 13:15

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

Nieprzeczytany post autor: ninjaproject »

Mistyfikator pisze:
07 maja 2022, 00:10
Temat związany z programowaniem. Backtesty.
Gdzie obecnie ścignąć dane do backtestów. Przez F2 nie wchodzi mi na MT4.
Wyświetla się komunikat "There are no new data for a symbol".
Przydałoby się m1 dla S&P500 i NASDAQ. W sumie jakieś Majorsy i GOLD też.
Fajnie by było chociaż od początku roku, ale skoro to m1 albo przynajmniej m5, to wiem że może sporo zajmować przestrzeni.
Z góry dzięki. Z chęcią opiszę wyniki testów, szkoda żeby VPS stał bezczynnie w weekend
Ja nie robię takich testów, bo to nie ma sensu. Ale, jeżeli chcesz robić takie testy, to musisz być offline, bo inaczej dane brokera nadpisują dane historyczne pobrane z innych źródeł. No i, tak jak piszesz, że robisz, to jedynie ściągasz dane od brokera, więc nie ma nowych danych, bo już masz to co ci broker zapodaje.

Jak ściągniesz dane, to w Centrum Historii masz guzik Importuj, i wtedy importujesz te dane z pliku, który ściągnąłeś.
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

Mistyfikator
Pasjonat
Pasjonat
Posty: 932
Rejestracja: 05 lip 2021, 20:35

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

Nieprzeczytany post autor: Mistyfikator »

ninjaproject pisze:
07 maja 2022, 01:08

Ja nie robię takich testów, bo to nie ma sensu. Ale, jeżeli chcesz robić takie testy, to musisz być offline, bo inaczej dane brokera nadpisują dane historyczne pobrane z innych źródeł. No i, tak jak piszesz, że robisz, to jedynie ściągasz dane od brokera, więc nie ma nowych danych, bo już masz to co ci broker zapodaje.

Jak ściągniesz dane, to w Centrum Historii masz guzik Importuj, i wtedy importujesz te dane z pliku, który ściągnąłeś.
Nie chodzi nawet o to, w jakim stopniu te wyniki oddadzą to, co by było gdyby.
Bardziej chodzi o obserwację, jak zachowywałaby się taka strategia na wykresie i o wyciągnięcie wniosków.
Wiem, że prawda wyjdzie dopiero na REALu, dlatego pewnie pokuszę się i wpłacę ze dwie stówki w przyszłym tygodniu, żeby było na czym testować. Skoro na DEMO strategia nie wydaje się być obarczona zbyt wielkim ryzykiem. Na pewno bardziej ryzykownie trejduję manualnie.

Jak nie zrobię testów to trudno, ja bardziej chciałem wykorzystać VPS-a, żeby coś zdziałać przez weekend.

Mistyfikator
Pasjonat
Pasjonat
Posty: 932
Rejestracja: 05 lip 2021, 20:35

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

Nieprzeczytany post autor: Mistyfikator »

Tak w ogóle, te backtesty przez większość czasu szły ślamazarnie wolno. Dopiero na koniec tetsowania zaczęły iść w ekspresowym tempie.

Mistyfikator
Pasjonat
Pasjonat
Posty: 932
Rejestracja: 05 lip 2021, 20:35

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

Nieprzeczytany post autor: Mistyfikator »

Jeszcze raz ja.
Mam pytanie, co jest nie tak w poniższym kodzie.
Jest to AutoBE:

Kod: Zaznacz cały

if(OrdersTotal()>=1)
  
  {
  for(int i=0;i<OrdersTotal();i++){
  if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
  Print("wybrano pozycję nr",i);
  double PoziomBE = OrderOpenPrice()+4;
  Print("Poziom na którym przestawimy SL to ",PoziomBE);
  if((Ask>OrderOpenPrice()+4))
  {double NEW_SL=OrderOpenPrice()+0.1;
  if(OrderModify(i,OrderOpenPrice(),NEW_SL,OrderTakeProfit(),0,clrNONE))
  {Print("przestawiono SL na poziom",NEW_SL);}
  else Print("czekamy na poziom BE",GetLastError());
  }
  }
  else
  Print("Czekamy na wybór pozycji ",OrderTicket(),". Błąd = ",GetLastError());
  
  }
  }
Oczywiście pomijając nieznormalizowany SL. Na razie sprawdzam na indeksach, później znormalizuję tak, żeby ułatwić działanie na majorsach.

Zdaje się, że wszystko uwzględniłem:
Zlecenie wybrane przez OrderSelect, następnie zmodyfikowane przez OrderModify, błędy zwracane również...
Próbowałem też zmienić warunek przesunięcia BE na warosć mniejszą od 5, a większą od 4.
Próbowałem też OrderModify bez "if"

Mimo to w backtestach nie przesuwa SL.

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 4944
Rejestracja: 30 lip 2019, 13:15

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

Nieprzeczytany post autor: ninjaproject »

W OrderModify() potrzebujesz OrderTicket(), nie "i".
Przykład:

Kod: Zaznacz cały

OrderModify(OrderTicket(),Sell_Price,Sell_SL,Sell_TP,0,clrNONE);
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

Mistyfikator
Pasjonat
Pasjonat
Posty: 932
Rejestracja: 05 lip 2021, 20:35

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

Nieprzeczytany post autor: Mistyfikator »

ninjaproject pisze:
08 maja 2022, 14:10
W OrderModify() potrzebujesz OrderTicket(), nie "i".
Przykład:

Kod: Zaznacz cały

OrderModify(OrderTicket(),Sell_Price,Sell_SL,Sell_TP,0,clrNONE);
Dzięki!
Nie wiem, jak Ty tak szybko lukasz na to forum.
Ja wywaliłem posta, bo już mi głupio pytać o każdą pierdołę, a tu już odpowiedź!

Nie zmienia to faktu, że zależy mi na nauce i nie chciałbym zostać odebrany w taki sposób, że próbuję się wyręczać kimś innym

BTW Tak w ogóle tą całą naukę MQL4 zacząłem w złym momencie, bo akurat mam bardzo ograniczony czas. Ale trudno, powoli oby do przodu.


Edit2, fragment kodu na AUTO BE, zobaczę w testach czy działa
Od razu ostrzeżenie, że wartości są dostosowane do indeksów, nie do walut:

Kod: Zaznacz cały

{
  for(int i=0;i<OrdersTotal();i++){
  if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
  Print("wybrano pozycję nr",i);
  double PoziomBE = OrderOpenPrice()+4;
  Print("poziom BE to",PoziomBE);
  if((Ask>OrderOpenPrice()+4))
  {double NEW_SL=OrderOpenPrice()+0.1;
  if(OrderModify(OrderTicket(),OrderOpenPrice(),NEW_SL,OrderTakeProfit(),0,clrNONE))
  {Print("przestawiono SL na poziom",NEW_SL);}
  else Print("czekamy na poziom BE",GetLastError());
  }
  }
  else
  Print("Czekamy na wybór pozycji ",OrderTicket(),". Błąd = ",GetLastError());
  
  }
Wiem, że nie ma Magic Number, ale tego nie rozgryzłem jeszcze

Edit3 Działa
Ostatnio zmieniony 08 maja 2022, 15:57 przez Mistyfikator, łącznie zmieniany 2 razy.

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 4944
Rejestracja: 30 lip 2019, 13:15

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

Nieprzeczytany post autor: ninjaproject »

Mistyfikator pisze:
08 maja 2022, 15:42
ninjaproject pisze:
08 maja 2022, 14:10
W OrderModify() potrzebujesz OrderTicket(), nie "i".
Przykład:

Kod: Zaznacz cały

OrderModify(OrderTicket(),Sell_Price,Sell_SL,Sell_TP,0,clrNONE);
Dzięki!
Nie wiem, jak Ty tak szybko lukasz na to forum.
Ja wywaliłem posta, bo już mi głupio pytać o każdą pierdołę, a tu już odpowiedź!

Nie zmienia to faktu, że zależy mi na nauce i nie chciałbym zostać odebrany w taki sposób, że próbuję się wyręczać kimś innym
A bo ja tak siedzę przed kompem, coś oglądam, patrzę na wykresy, i co chwila lookam na to forum, między innymi.
Jak mnie wkurwisz, to ci powiem coś odpowiednio, także nie martw się.
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

Mistyfikator
Pasjonat
Pasjonat
Posty: 932
Rejestracja: 05 lip 2021, 20:35

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

Nieprzeczytany post autor: Mistyfikator »

ninjaproject pisze:
08 maja 2022, 15:51

A bo ja tak siedzę przed kompem, coś oglądam, patrzę na wykresy, i co chwila lookam na to forum, między innymi.
Jak mnie wkurwisz, to ci powiem coś odpowiednio, także nie martw się.
Luzik, ja tez jestem szczery, ale na forum staram się trzymać kulturkę, tylko gdzieś kiedyś tam rzuciłem bluzgi bo się zagotowałem, ale szybko wykasowałem swojego posta poniżej poziomu, bo jestem zdania, że pewne rzeczy nie przystoją człowiekowi XXI wieku.

Mnie wkurwiają niektóre posty w sieci i te nędzne kłótnie o chooj wie co, dlatego m. in. skasowałem FB, żeby tego nie oglądać


***

Co do MQL4, już widzę znaczący progres - ostatnie kompilacje są pozbawione jakichkolwiek "Warnings"

Awatar użytkownika
ninjaproject
Maniak
Maniak
Posty: 4944
Rejestracja: 30 lip 2019, 13:15

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

Nieprzeczytany post autor: ninjaproject »

Mistyfikator pisze:
08 maja 2022, 15:54


***

Co do MQL4, już widzę znaczący progres - ostatnie kompilacje są pozbawione jakichkolwiek "Warnings"
Warning is your friend!
Potrzebujesz go polubić.
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

Mistyfikator
Pasjonat
Pasjonat
Posty: 932
Rejestracja: 05 lip 2021, 20:35

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

Nieprzeczytany post autor: Mistyfikator »

Napisałem EA, które otwiera pozycję, kiedy cena Bid/Ask oddala się od ceny otwarcia świecy m5 o określoną wartość.
Drugie kryterium wejścia to średnia krocząca M30, jeśli cena jest nad to kupujemy, pod średnią M30 sprzedajemy.
Następnie, po otwarciu konkretnej pozycji i osiągnięciu poziomu ceny określonego w kodzie, przesuwamy SL na BE.
Parametry dostosowane do NAS100 i do S&P500.

Oczywiście zastrzegam sobie, że EA powstało w celach edukacyjnych i w obecnym kształcie nie ma szans zarabiać.
Wrzucenie tego na konto REAL oznaczać może co najwyżej stratę. Nie wyzeruje konta od razu, ale będzie konsekwentnie pomniejszać depo. Jest to tylko część większego projektu:

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                 DlugoscSwiec.mq4 |
//|                                                          MSTFKTR |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "MSTFKTR"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int SMA=30;
input int SL=1000;
input int TP=3000;
input ENUM_TIMEFRAMES    PERIOD=PERIOD_M30;
input double Lot=0.1;

bool L=false;
bool S=false;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
 
   
  
  if((OrdersTotal()>=1)&&(OrderType()==OP_BUY))
  {
  for(int i=0;i<OrdersTotal();i++){
  if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
  Print("wybrano pozycję nr",i);
  double PoziomBE = OrderOpenPrice()+5;
  Print("poziom BE to",PoziomBE);
  if((Ask>OrderOpenPrice()+5))
  {double NEW_SL=OrderOpenPrice()+2;
  if(OrderModify(OrderTicket(),OrderOpenPrice(),NEW_SL,OrderTakeProfit(),0,clrNONE))
  {Print("przestawiono SL na poziom",NEW_SL);}
  else Print("czekamy na poziom BE",GetLastError());
  }
  }
  else
  Print("Czekamy na wybór pozycji ",OrderTicket(),". Błąd = ",GetLastError());
  
  }
 
  
  }
  
  if((OrdersTotal()>=1)&&(OrderType()==OP_SELL))
  {
  for(int i=0;i<OrdersTotal();i++){
  if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
  Print("wybrano pozycję nr",i);
  double PoziomBE = OrderOpenPrice()-5;
  Print("poziom BE to",PoziomBE);
  if((Ask>OrderOpenPrice()-5))
  {double NEW_SL=OrderOpenPrice()-2;
  if(OrderModify(OrderTicket(),OrderOpenPrice(),NEW_SL,OrderTakeProfit(),0,clrNONE))
  {Print("przestawiono SL na poziom",NEW_SL);}
  else Print("czekamy na poziom BE",GetLastError());
  }
  }
  else
  Print("Czekamy na wybór pozycji ",OrderTicket(),". Błąd = ",GetLastError());
  
  }
 
  
  }
  
  
  
  if(OrdersTotal()<1){
   L=false;S=false;
  
  
  double aStopLoss = Ask - SL*_Point;  
  double bStopLoss = Bid + SL*_Point;
  double aTakeProfit = Ask + TP*_Point;
  double bTakeProfit = Bid - TP*_Point;
  
  aStopLoss=NormalizeDouble(aStopLoss,_Digits);
  bStopLoss=NormalizeDouble(bStopLoss,_Digits);
  aTakeProfit=NormalizeDouble(aTakeProfit,_Digits);
  bTakeProfit=NormalizeDouble(bTakeProfit,_Digits);
  
  double SMA_M30 = iMA(NULL, PERIOD_M30, SMA, 0, 0, 0, 1);
  Print("SMA=",SMA_M30);
  if(Ask>SMA_M30){Print("dozwolone jest kupno");}
  if(Bid<SMA_M30){Print("dozwolona jest sprzedaż");}
  
  
 
  if((Ask>iOpen(NULL, PERIOD_M5, 0)+5)&&(Ask>SMA_M30)){L=true;S=false;}
  else{L=false;S=false;}
  if((Bid<iOpen(NULL, PERIOD_M5, 0)-5)&&(Bid<SMA_M30)){S=true;L=false;}
  else{L=false;S=false;}
  Print("S=",S," L=",L);
  Print("Ask+1000=",Ask+10);
  if(L){
   if(OrderSend(NULL,OP_BUY,Lot,Ask,0,aStopLoss,aTakeProfit,NULL,0,0,clrNONE)<0)
     Print("Zakup nieudany ",GetLastError());
   else
     Print("kupiono za",Ask);}
     
  if(S){
   if(OrderSend(NULL,OP_SELL,Lot,Bid,0,bStopLoss,bTakeProfit,NULL,0,0,clrNONE)<0) 
     Print("Sprzedaż nieudana ",GetLastError());
   else
     Print("sprzedano za",Bid);}
  
  
//---
  }
//---
   
  }
//+------------------------------------------------------------------+

Mam w związku powyższym taką kwestię:
Chciałbym badać bieżącą świecę i potrzebuję parametru iHighest oraz iLowest.

Czy można zbadać tę wartość dla świecy o indeksie 0, czy tylko 1?
Czyli, czy tą wartość dostanę dopiero po narysowaniu się świecy?
Próbowałem już iHighest w Sell, ale niestety nie zadziałało


Edit: Dobra, nie popatrzyłem jakie ma parametry iHighest. Napisane jest, że można zbadać indeks 0, także sam sobie odpowiadam na pytanie. Posta zostawiam wraz z kodem,

ODPOWIEDZ