Wszystkie pytania dozwolone początkujących programistów

O jezykach programowania w platformach i nie tylko.
Szymon_P
Stały bywalec
Stały bywalec
Posty: 60
Rejestracja: 31 paź 2015, 22:35

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

Nieprzeczytany post autor: Szymon_P »

Witam,
potrzebuję funkcję, która zwróci mi cenę ostatniej otwartej pozycji. Znalazłem kod w necie, ale mam problem bo podczas testów uwzględnia też ceny zleceń oczekujących tzn. Jak otworze pozycję i ustawie zlecenie np. BuyStop to jako ostatnią cenę zwraca właśnie poziom BuyStop,a nie ostatniej transakcji. Interesuje mnie tylko cena buy lub sell ostatniej transakcji.
Jakiś pomysł jak to zmienić?

double PositionLastOpenedPriceOpen(string f_symbol="", // instrument finansowy
int f_cmd=-1, // typ pozycji
int f_magic=-1) // identyfikator
{
if(f_cmd==OP_BUYLIMIT || f_cmd==OP_SELLLIMIT ||
f_cmd==OP_BUYSTOP || f_cmd==OP_SELLSTOP)
return DBL_MAX;
//---
datetime f_timeOpen=0;
double f_priceOpen=DBL_MAX;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if((f_symbol==OrderSymbol() || f_symbol=="") &&
(f_cmd ==OrderType() || f_cmd==-1) &&
(f_magic ==OrderMagicNumber() || f_magic==-1))
if(OrderOpenTime()>f_timeOpen)
{
f_timeOpen=OrderOpenTime();
f_priceOpen=OrderOpenPrice();
}
return f_priceOpen;

Szymon_P
Stały bywalec
Stały bywalec
Posty: 60
Rejestracja: 31 paź 2015, 22:35

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

Nieprzeczytany post autor: Szymon_P »

Temat nieaktualny. Już sobie poradziłem.

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 »

Szymon_P pisze:
05 paź 2021, 22:14
Temat nieaktualny. Już sobie poradziłem.
No i brawo Ty!
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

Szymon_P
Stały bywalec
Stały bywalec
Posty: 60
Rejestracja: 31 paź 2015, 22:35

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

Nieprzeczytany post autor: Szymon_P »

Moje ostatnie EA na testach chodzi dobrze tzn. wykonuje dokładnie to co ma robić. Problem pojawia się w momencie, gdy odpalam na rynku więcej niż jeden wykres. W innych EA stosowałem zawsze OrderMagicNumber()==magicnumber && OrderSymbol()==_Symbol i działa to dobrze przy kilku wykresach jednocześnie. Czy jeszcze na coś zwracać uwagę? Są jakieś konkretne zasady w jakich miejscach stosuje się selekcję?

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 »

Szymon_P pisze:
06 paź 2021, 08:46
Moje ostatnie EA na testach chodzi dobrze tzn. wykonuje dokładnie to co ma robić. Problem pojawia się w momencie, gdy odpalam na rynku więcej niż jeden wykres. W innych EA stosowałem zawsze OrderMagicNumber()==magicnumber && OrderSymbol()==_Symbol i działa to dobrze przy kilku wykresach jednocześnie. Czy jeszcze na coś zwracać uwagę? Są jakieś konkretne zasady w jakich miejscach stosuje się selekcję?
Sprawdź, czy wszędzie w kodzie, gdzie obsługujesz transakcje, sprawdzasz te dwa parametry!
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

Szymon_P
Stały bywalec
Stały bywalec
Posty: 60
Rejestracja: 31 paź 2015, 22:35

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

Nieprzeczytany post autor: Szymon_P »

Problem z otwieraniem pozycji na demo (kilka wykresów) występuje na tym etapie. Na testerze działa bez problemów. Chodzi o to, że jak zostanie zrealizowany BUY lub SELL (rozpoczęcie handlu) to ma mi otworzyć zlecenie oczekujące po cenie "Piramida" i wielkość "LotSize". Następnie jak zrealizuje zlecenie STOP to dołoży kolejne znów po cenie "Piramida, która się zaktualizuje. Wartość "Piramida" i "LotSize" są obliczane dobrze co sprawdzam na razie poprzez Print. StopLoss ustawia mi automatycznie inna funkcja, która działa bez problemu.

if(SELL==true && Koniec && F1==true && F5==true)
{
if(OrderStopLoss()!=StopLossEA && OrderMagicNumber()==MagicNumber && OrderSymbol()==_Symbol)
{
OrderSend(_Symbol,OP_SELLSTOP,LotSize,Piramida,MaxSlippage,0,0,NULL,MagicNumber,0,Green);
Kontrola=true;
}
}
if(BUY==true && Koniec && F1==true && F5==true)
{
if(OrderStopLoss()!=StopLossEA && OrderMagicNumber()==MagicNumber && OrderSymbol()==_Symbol)
{
OrderSend(_Symbol,OP_BUYSTOP,LotSize,Piramida,MaxSlippage,0,0,NULL,MagicNumber,0,Green);
Kontrola=true;
}
}

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 »

Szymon_P pisze:
07 paź 2021, 09:01
Problem z otwieraniem pozycji na demo (kilka wykresów) występuje na tym etapie. Na testerze działa bez problemów. Chodzi o to, że jak zostanie zrealizowany BUY lub SELL (rozpoczęcie handlu) to ma mi otworzyć zlecenie oczekujące po cenie "Piramida" i wielkość "LotSize". Następnie jak zrealizuje zlecenie STOP to dołoży kolejne znów po cenie "Piramida, która się zaktualizuje. Wartość "Piramida" i "LotSize" są obliczane dobrze co sprawdzam na razie poprzez Print. StopLoss ustawia mi automatycznie inna funkcja, która działa bez problemu.

if(SELL==true && Koniec && F1==true && F5==true)
{
if(OrderStopLoss()!=StopLossEA && OrderMagicNumber()==MagicNumber && OrderSymbol()==_Symbol)
{
OrderSend(_Symbol,OP_SELLSTOP,LotSize,Piramida,MaxSlippage,0,0,NULL,MagicNumber,0,Green);
Kontrola=true;
}
}
if(BUY==true && Koniec && F1==true && F5==true)
{
if(OrderStopLoss()!=StopLossEA && OrderMagicNumber()==MagicNumber && OrderSymbol()==_Symbol)
{
OrderSend(_Symbol,OP_BUYSTOP,LotSize,Piramida,MaxSlippage,0,0,NULL,MagicNumber,0,Green);
Kontrola=true;
}
}
Ten kod to za mało, żeby stwierdzić gdzie występuje błąd.
Mogę tylko ci poprawić kod w tym sensie, że ta Kontrola=true to nic nie robi, bo ona nie sprawdza wykonania OrderSend().
Powinno być:

Kod: Zaznacz cały

if(SELL==true && Koniec && F1==true && F5==true)
      {
         if(OrderStopLoss()!=StopLossEA && OrderMagicNumber()==MagicNumber && OrderSymbol()==_Symbol)
         {
         if(OrderSend(_Symbol,OP_SELLSTOP,LotSize,Piramida,MaxSlippage,0,0,NULL,MagicNumber,0,Green)>0)
         Kontrola=true;
         }
      }
if(BUY==true && Koniec && F1==true && F5==true)
      {
         if(OrderStopLoss()!=StopLossEA && OrderMagicNumber()==MagicNumber && OrderSymbol()==_Symbol)
         {
         if(OrderSend(_Symbol,OP_BUYSTOP,LotSize,Piramida,MaxSlippage,0,0,NULL,MagicNumber,0,Green)>0)
         Kontrola=true;         
         }
      }
Poza tym, to czy "Koniec" jest bool?
Jeżeli tak, to wystarczy:

Kod: Zaznacz cały

if(SELL && Koniec && F1 && F5)
      {
         if(OrderStopLoss()!=StopLossEA && OrderMagicNumber()==MagicNumber && OrderSymbol()==_Symbol)
         {
         if(OrderSend(_Symbol,OP_SELLSTOP,LotSize,Piramida,MaxSlippage,0,0,NULL,MagicNumber,0,Green)>0)
         Kontrola=true;
         else
         Print("OrderSend failed with error #",GetLastError());
         }
      }
if(BUY && Koniec && F1&& F5)
      {
         if(OrderStopLoss()!=StopLossEA && OrderMagicNumber()==MagicNumber && OrderSymbol()==_Symbol)
         {
         if(OrderSend(_Symbol,OP_BUYSTOP,LotSize,Piramida,MaxSlippage,0,0,NULL,MagicNumber,0,Green)>0)
         Kontrola=true;    
         else
         Print("OrderSend failed with error #",GetLastError());     
         }
      }
I niestety, ale w tym kawałku kodu nie ma rozwiązania twojego problemu.
Problem może leżeć w tym, że nie znormalizowałeś ceny Piramida.

Kod: Zaznacz cały

Piramida=NormalizeDouble(Piramida,_Digits);
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

Szymon_P
Stały bywalec
Stały bywalec
Posty: 60
Rejestracja: 31 paź 2015, 22:35

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

Nieprzeczytany post autor: Szymon_P »

Mam normalizowane ceny. Co do kontroli to tak tylko wstawiłem, żeby mi zmienne potwierdzało, że prawidłowo liczy. Obliczenia wykonuję w ten sposób.

Ostatnia_Szymon=Ostatnia_Cena_SZYMON();

if(BUY==true)
{
Piramida=Ostatnia_Szymon+(StopLoss*pips);
Piramida=NormalizeDouble(Piramida,Digits);
StopLossEA=Ostatnia_Szymon-(StopLoss*pips);
StopLossEA=NormalizeDouble(StopLossEA,_Digits);
}

if(SELL==true)
{
Piramida=Ostatnia_Szymon-(StopLoss*pips);
Piramida=NormalizeDouble(Piramida,Digits);
StopLossEA=Ostatnia_Szymon+(StopLoss*pips);
StopLossEA=NormalizeDouble(StopLossEA,_Digits);
}

a funkcja wygląda tak:

double Ostatnia_Cena_SZYMON()
{
datetime f_timeOpen=0;
double f_priceOpen=DBL_MAX;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==_Symbol && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderMagicNumber()== MagicNumber)
if(OrderOpenTime()>f_timeOpen)
{
f_timeOpen=OrderOpenTime();
f_priceOpen=OrderOpenPrice();
}
return f_priceOpen;
}

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 »

Szymon_P pisze:
07 paź 2021, 18:57
Mam normalizowane ceny. Co do kontroli to tak tylko wstawiłem, żeby mi zmienne potwierdzało, że prawidłowo liczy. Obliczenia wykonuję w ten sposób.

Ostatnia_Szymon=Ostatnia_Cena_SZYMON();

if(BUY==true)
{
Piramida=Ostatnia_Szymon+(StopLoss*pips);
Piramida=NormalizeDouble(Piramida,Digits);
StopLossEA=Ostatnia_Szymon-(StopLoss*pips);
StopLossEA=NormalizeDouble(StopLossEA,_Digits);
}

if(SELL==true)
{
Piramida=Ostatnia_Szymon-(StopLoss*pips);
Piramida=NormalizeDouble(Piramida,Digits);
StopLossEA=Ostatnia_Szymon+(StopLoss*pips);
StopLossEA=NormalizeDouble(StopLossEA,_Digits);
}

a funkcja wygląda tak:

double Ostatnia_Cena_SZYMON()
{
datetime f_timeOpen=0;
double f_priceOpen=DBL_MAX;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==_Symbol && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderMagicNumber()== MagicNumber)
if(OrderOpenTime()>f_timeOpen)
{
f_timeOpen=OrderOpenTime();
f_priceOpen=OrderOpenPrice();
}
return f_priceOpen;
}
Chłopie, przecież z tego nic nie wynika.
Pisz:
Print("To co sprawdzam: ",SprawdzanaZmienna);
I wklejaj po kolei w istotne miejsca w kodzie i sprawdzaj po kolei, gdzie występuje błąd.
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1521
Rejestracja: 09 sie 2009, 21:27

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

Nieprzeczytany post autor: personov »

Proszę o podpowiedź jak odświeżyć wykres ?
Skutku nie przynosi RefreshRates(), WindowRedraw() ani ChartRedraw().
Natomiast samo wciśnięcie prawym przyciskiem myszy i "Odśwież" działa, fajnie odświeża wszystko na wykresie.
Taki właśnie skutek chciałbym uzyskać wykorzystując kod.
W czym może tkwić problem ? Spotkał się ktoś kiedyś z takim problemem ?
Solą życia jest kasa.

ODPOWIEDZ