Wszystkie pytania dozwolone początkujących programistów
Re: Wszystkie pytania dozwolone początkujących programistów
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;
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;
Re: Wszystkie pytania dozwolone początkujących programistów
Temat nieaktualny. Już sobie poradziłem.
- ninjaproject
- Maniak
- Posty: 4944
- Rejestracja: 30 lip 2019, 13:15
Re: Wszystkie pytania dozwolone początkujących programistów
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.
Programuję wskaźniki i EA do MetaTrader 4/5.
Re: Wszystkie pytania dozwolone początkujących programistów
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ę?
- ninjaproject
- Maniak
- Posty: 4944
- Rejestracja: 30 lip 2019, 13:15
Re: Wszystkie pytania dozwolone początkujących programistów
Sprawdź, czy wszędzie w kodzie, gdzie obsługujesz transakcje, sprawdzasz te dwa parametry!Szymon_P pisze: ↑06 paź 2021, 08:46Moje 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ę?
Trejder, Mentor/trener, aka. Dadas, fx-technik, obecnie ninjaproject.
Programuję wskaźniki i EA do MetaTrader 4/5.
Programuję wskaźniki i EA do MetaTrader 4/5.
Re: Wszystkie pytania dozwolone początkujących programistów
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;
}
}
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;
}
}
- ninjaproject
- Maniak
- Posty: 4944
- Rejestracja: 30 lip 2019, 13:15
Re: Wszystkie pytania dozwolone początkujących programistów
Ten kod to za mało, żeby stwierdzić gdzie występuje błąd.Szymon_P pisze: ↑07 paź 2021, 09:01Problem 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;
}
}
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;
}
}
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());
}
}
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.
Programuję wskaźniki i EA do MetaTrader 4/5.
Re: Wszystkie pytania dozwolone początkujących programistów
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;
}
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;
}
- ninjaproject
- Maniak
- Posty: 4944
- Rejestracja: 30 lip 2019, 13:15
Re: Wszystkie pytania dozwolone początkujących programistów
Chłopie, przecież z tego nic nie wynika.Szymon_P pisze: ↑07 paź 2021, 18:57Mam 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;
}
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.
Programuję wskaźniki i EA do MetaTrader 4/5.
Re: Wszystkie pytania dozwolone początkujących programistów
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 ?
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.