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 »

grzegrzyw pisze:
27 lis 2020, 22:36
Ja stosuję zapis: int ticket = OrderSend (Symbol(),........ Sprawdź jaki masz zapis w dzienniku.
To się robi w celu sprawdzenia błędu wykonania kodu, czyli ERROR.
Oczywiście, należy to zawsze robić.
MetaEditor też o tym przypomina przy kompilacji kodu.
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

blashka
Stały bywalec
Stały bywalec
Posty: 41
Rejestracja: 27 lis 2020, 18:12

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

Nieprzeczytany post autor: blashka »

grzegrzyw pisze:
27 lis 2020, 22:36
Ja stosuję zapis: int ticket = OrderSend (Symbol(),........ Sprawdź jaki masz zapis w dzienniku.
Dzięki za odpowiedź i pomoc. Niestety wiedziałem o tym int ticket i stosowałem go wcześniej i nie dawało to żadnego rezultatu, a wolałem nie inicjować tej zmiennej bo nie wiedziałem po co to się robi i do czego służy akurat w tym wypadku.

blashka
Stały bywalec
Stały bywalec
Posty: 41
Rejestracja: 27 lis 2020, 18:12

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

Nieprzeczytany post autor: blashka »

ninjaproject pisze:
27 lis 2020, 22:40
1. Jak ma być z 10 dni, to PERIOD_D1.
_Period to jest bieżący interwał, czyli ten, na który patrzysz.

2. Cena bieżąca może nie być równa (==). Raczej ciężko będzie trafić w kwotowania dokładnie równe.

3. NormalizeDouble(Ask-600*_Point,Digits), NormalizeDouble(Ask+1200*_Point,Digits)
Dzięki za odpowiedź i pomoc. Zastosowałem podpunkty 1 oraz 3 ale bez efektu. Co do podpunktu drugiego, jak można zastąpić ten znak (==)? Chodzi mi bardziej o to w jaki sposób dodać poślizg do tego aby wyłapywało większy zakres. Próbowałem również robić taki warunek ale również bez skutku:
int najwyzszaCena = iHighest(_Symbol,PERIOD_D1, MODE_HIGH, 10, 0);
double vask = MarketInfo(_Symbol, MODE_ASK);

if (vask==najwyzszaCena)
//zinicjalizowanie vask zamiast Ask

grzegrzyw
Gaduła
Gaduła
Posty: 335
Rejestracja: 11 mar 2012, 19:43

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

Nieprzeczytany post autor: grzegrzyw »

ninjaproject pisze:
27 lis 2020, 22:40

3. NormalizeDouble(Ask-600*_Point,Digits), NormalizeDouble(Ask+1200*_Point,Digits)
Zapis 'NormalizeDouble" nie jest w tym przypadku konieczny, Ask i Bid zawsze są "znormalizowane", zapis ten jest konieczny gdy cena jest odczytywana z jakiegoś wskaźnika lub np. wartości linii trendu itp.

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 »

grzegrzyw pisze:
28 lis 2020, 09:45
ninjaproject pisze:
27 lis 2020, 22:40

3. NormalizeDouble(Ask-600*_Point,Digits), NormalizeDouble(Ask+1200*_Point,Digits)
Zapis 'NormalizeDouble" nie jest w tym przypadku konieczny, Ask i Bid zawsze są "znormalizowane", zapis ten jest konieczny gdy cena jest odczytywana z jakiegoś wskaźnika lub np. wartości linii trendu itp.
Nie chce mi się sprawdzać, ale to jest kalkulacja.
Trzeba by sprawdzić co wyrzuca Print.
Kodując, łatwiej jest z założenia wyrzucić kalkulację przed OrderSend() i ją znormalizować z założenia, żeby potem nie mieć problemu.
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

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 »

Tak to się robi poprawnie!

Kod: Zaznacz cały

string       order_symbol = _Symbol;
int           order_type = OP_BUY;
double     order_tradevolume = 0.1;
double     order_entryprice = Ask; // lub NormalizeDouble(entryprice,Digits);
int           order_slippage = 3;
double     order_slprice = NormalizeDouble(Ask-600*_Point,Digits);
double     order_tpprice = NormalizeDouble(Ask+1200*_Point,Digits);
string       order_comment = "Mój komentarz";
int           order_magicnumber = 123456; 
datetime  order_expiration = 0;  // lub data wygaśnięcia
color        order_arrowcolor = clrNONE; // lub jakiś color

if(
OrderSend(
        order_symbol,
        order_type, 
        order_tradevolume, 
        order_entryprice, 
        order_slippage, 
        order_slprice, 
        order_tpprice, 
        order_comment, 
        order_magicnumber, 
        order_expiration, 
        order_arrowcolor)
 <0) {
   Print(
       "OrderSend failed with error #",GetLastError()
         );
      }
else
       {
   Print(
       "OrderSend placed successfully"
         );
        }
Uwaga: Ten tutaj editor robi sam klocki, tzn. wcina spacje w górnej sekcji zmiennych, których nie zrobiłem.
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

blashka
Stały bywalec
Stały bywalec
Posty: 41
Rejestracja: 27 lis 2020, 18:12

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

Nieprzeczytany post autor: blashka »

Zastosowałem również taki skrypt:
int najwyzszaCena = iHighest(_Symbol,PERIOD_D1, MODE_HIGH, 10, 0);
int najnizszaCena = iLowest(_Symbol, PERIOD_D1, MODE_LOW, 10, 0);
if(Ask>=najwyzszaCena)
{
//int ticketBuy = OrderSend
}
if(Bid<=najnizszaCena)
{
//int ticketSell = OrderSend
}
Niestety otwiera tylko pozycje krótkie i nie w minimach z 10 dni lecz w losowych miejscach, po zmianie znaków otwiera również pozycje długie lecz też nie w miejscach maximum.(pozycje krótkie również są otwierane - również nie we właściwych - losowych miejscach).

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 »

blashka pisze:
30 lis 2020, 19:57
Zastosowałem również taki skrypt:
int najwyzszaCena = iHighest(_Symbol,PERIOD_D1, MODE_HIGH, 10, 0);
int najnizszaCena = iLowest(_Symbol, PERIOD_D1, MODE_LOW, 10, 0);
if(Ask>=najwyzszaCena)
{
//int ticketBuy = OrderSend
}
if(Bid<=najnizszaCena)
{
//int ticketSell = OrderSend
}
Niestety otwiera tylko pozycje krótkie i nie w minimach z 10 dni lecz w losowych miejscach, po zmianie znaków otwiera również pozycje długie lecz też nie w miejscach maximum.(pozycje krótkie również są otwierane - również nie we właściwych - losowych miejscach).
Takie coś "//" powoduje, że dana linijka nie jest czytana.
To służy do wstawiania sobie komentarzy własnych, czy opisów.
Naucz się najpierw co-nieco, zanim zaczniesz pisać eksperty, bo to może cię słono kosztować!

Poza tym, to przy takim warunku będzie ci otwierać zawsze, gdy Ask>=najwyzszaCena.
Dopóki warunek jest spełniony, to ci będzie otwierać trady, do końca depo.

Jeżeli, np. chcesz otwierać tylko jedną pozycję, to musisz napisać kod, który będzie czytał ile pozycji jest otwartych.
No i warunek musi to uwzględniać.
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

blashka
Stały bywalec
Stały bywalec
Posty: 41
Rejestracja: 27 lis 2020, 18:12

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

Nieprzeczytany post autor: blashka »

Sorry mój błąd z tym //. Wiem że znak ten służy do wstawiania komentarzy. Po prostu nie chciałem kopiować całego skryptu i myślałem że to będzie dla Was bardziej czytelne (najwyraźniej się myliłem :D). Generalnie ilość pozycji mam już policzoną i otwiera tylko jedną pozycję. Cały skrypt jest dużo bardziej rozbudowany i miałem problem tylko z tym zagadnieniem. Jeżeli to nie kłopot a ułatwi to interpretację mogę wstawić cały kod i na tej podstawie będziecie mogli mi jakoś pomóc rozwiązać ten beznadziejny problem. Pozdrawiam.

blashka
Stały bywalec
Stały bywalec
Posty: 41
Rejestracja: 27 lis 2020, 18:12

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

Nieprzeczytany post autor: blashka »

#property strict
#property script_show_inputs

input int stopLoss = 600;
input double lots = 0.10;

void OnTick()
{

int najwyzszaCena = iHighest(_Symbol,PERIOD_D1, MODE_HIGH, 10, 0);
int najnizszaCena = iLowest(_Symbol, PERIOD_D1, MODE_LOW, 10, 0);

double vask = MarketInfo(_Symbol, MODE_ASK);
double vbid = MarketInfo(_Symbol,MODE_BID);

string signal ="";

double sredniaKroczaca10 = iMA(_Symbol, _Period, 10, 0, MODE_SMA, PRICE_CLOSE, 0);
double sredniaKroczaca40 = iMA(_Symbol, _Period, 40, 0, MODE_SMA, PRICE_CLOSE, 0);

if (vask>=najwyzszaCena && sredniaKroczaca10>sredniaKroczaca40)
{

signal="buy";

if(DayOfWeek()==1 || DayOfWeek()==2)
CloseBuyPositions();

}

if (vbid<=najnizszaCena && sredniaKroczaca10<sredniaKroczaca40)
{

signal="sell";

if(DayOfWeek()==1 || DayOfWeek()==2)
CloseSellPositions();

}

if (signal=="buy" && OrdersTotal()==0 && DayOfWeek()==5)
int ticketBuy = OrderSend (_Symbol, OP_BUY, lots, Ask, 3, NormalizeDouble(Ask-stopLoss*_Point,Digits), 0, NULL, 0, 0, Green);

if (signal=="sell" && OrdersTotal()==0 && DayOfWeek()==5)
int ticketSell = OrderSend (_Symbol, OP_SELL, lots, Bid, 3, NormalizeDouble(Bid+stopLoss*_Point,Digits), 0, NULL, 0, 0, Red);

Comment ("Sygnał: ", signal);
}

void CloseBuyPositions()
{

for(int i=OrdersTotal()-1; i >=0; i--)
{

int selectBuyTicket = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
string CurrencyPairBuy = OrderSymbol();

if(_Symbol== CurrencyPairBuy)
if(OrderType()==OP_BUY)
{
int closeBuyTicket = OrderClose(OrderTicket(), OrderLots(), Bid, 3, NULL);
}

}
}

void CloseSellPositions()
{

for(int i=OrdersTotal()-1; i>=0; i--)
{

int selectSellTicket = OrderSelect(i,SELECT_BY_POS, MODE_TRADES);
string CurrencyPairSell = OrderSymbol();

if(_Symbol== CurrencyPairSell)
if(OrderType()==OP_SELL)
{
int closeSellTicket = OrderClose(OrderTicket(), OrderLots(), Ask, 3, NULL);
}
}
}

ODPOWIEDZ