Forex programozás › Fórum › Egyéb › megbízások zárása, módosítása
Címkézve: zárás
-
SzerzőBejegyzés
-
Hello Radu!
A robotomban több megbízás is van és olyan problémám akadt, hogy valamiért az összesre kihat az OrderClose és az OrderModify fügvény.
Pl:.
Van 3 megbízásom.
Legyen a nevük: buy1, buy2, buy3
Azt szeretném, ha csak a buy1 megbízásomat zárná le az OrderClose függvény.
buy1=OrderTicket();
buy2=OrderTicket();
buy3=OrderTicket();
total=OrdersTotal();buy1=OrderSend(Symbol(),OP_BUY,lots,Ask,3,Ask-80*Point,Ask+140*Point);
for(buy1=0;buy1Close[A_bars] && test_B<0.0001)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Yellow); // így mind a hármat bezárja.
OrderClose(buy1,Lots,Bid,3,Yellow); // így pedig nem csinál semmit.
}
}
}
}
Remélem sikerült érthetően leírnom. :)Válaszodat előre is köszönöm.
Bocsi elírtam véletlen az egyik részét pontosítok.
buy1=OrderSend(Symbol(),OP_BUY,lots,Ask,3,Ask-80*Point,Ask+140*Point);
for(buy1=0;buy1<total;buy1++)
{
OrderSelect(buy1, SELECT_BY_POS, MODE_TRADES);
{
if(OrderType()==OP_BUY) // long position is opened
{
if(Close[A_bars] && test_B<0.0001)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Yellow); // így mind a hármat bezárja.
OrderClose(buy1,Lots,Bid,3,Yellow); // így pedig nem csinál semmit.
}
}
}
}Minek a for ciklus? A buy1 változó értékét már az első pillanatban kinullázod (buy1=0 résznél), így gyakorlatilag nullától végigmész total értékéig, ezért zár mindent.
Ha megvan a ticket számod (és az helyes), akkor for ciklus nélkül elég neki egy OrderClose.
Hello Radu!
A Problémám a következő: pl:. H1-es charton van 2 db (H1_buy_a és H1_buy_b nevű) pozícióm és azt szeretném ha az ordermodify külön külön kezelné a 2 pozíciót.
Így próbáltam megoldani de sajnos nem jó mert mindig csak egyik pozíciót kezeli.(szerintem H1_buy_a=orderticket() -miatt.)
pl:.H1_buy_a
for(i=0;i<H1_buy_a;i++)
{
if(OrderSelect(i,SELECT_BY_POS))
{
H1_buy_a=OrderTicket();
if (TS < Min_Dist)
TS=Min_Dist;
{
if (NormalizeDouble(SL,Digits)< // If it is lower than we want
NormalizeDouble(Bid-TS*Point,Digits))
{
SL=Bid-TS*Point;
OrderModify(H1_buy_a,lots,SL,TP,Expiration);
}
}
}
}
pl:.H1_buy_b
for(i=0;i<H1_buy_b;i++)
{
if(OrderSelect(i,SELECT_BY_POS))
{
H1_buy_b=OrderTicket();
if (TS < Min_Dist)
TS=Min_Dist;
{
if (NormalizeDouble(SL,Digits)< // If it is lower than we want
NormalizeDouble(Bid-TS*Point,Digits))
{
SL=Bid-TS*Point;
OrderModify(H1_buy_b,lots,SL,TP,Expiration);
}
}
}
}
Tehát amikor a második H1_buy_b nevű pzíció létrejön akkor a H1_buy_a nevű pozíciót nem kezeli.
Volt rá példa amikor egy másik charton lévő pozíció kavart be, hiába adtam neki más nevet.Segítségedet előre is köszönöm.
Ellenőrizd, hogy a két változód – amelyben a két ticket számot őrzöd – egyáltalán rendelkezik-e adattal. Nem jó arra építeni, hogy „egyszer már volt helyes értékük”.
A pozíciók átnyálazása során mindig az ÖSSZES pozíciót nézd végig, és ezekből szűrj magic szám, típus és egyéb feltételek alapján. Ha két buy pozíciót akarsz kezelni, akkor keress és várj el két darab buy pozíciót. Az is egy helyzet, ha nincsen buy pozíció, az is ha több van mint kettő, az is ha kevesebb mint kettő. A „melyik a régebbi pozi” problémát legegyszerűbben a ticket számmal tudod eldönteni: az újabb pozíciónak nagyobb ticket száma van.
A Min_Dist és TS eredeti (kiindulási) értékét nem látom, de érdemes azt is ellenőrizned mert lehet hogy inkább ott van a baj. Ha mindkettő érték nulla, akkor már nem jutsz be abba az if ágba, amely csinálna is valamit.
A segítséged után a következőképpen korigáltam:
1. eset:
for(i=1;i<=OrdersTotal();i++)
{
if(OrderSelect(i-1,SELECT_BY_POS))
{
H1_buy_a=OrderTicket();
if(OrderComment()=="H1_buy_a")
{
if (TS < Min_Dist)
TS=Min_Dist;
{
if (NormalizeDouble(SL,Digits)< // If it is lower than we want
NormalizeDouble(Bid-TS*Point,Digits))
{
SL=Bid-TS*Point;
OrderModify(H1_buy_a,lots,SL,TP,Expiration);
}
}
}
}
}
2. eset:
for(i=2;i<=OrdersTotal();i++)
{
if(OrderSelect(i-1,SELECT_BY_POS))
{
H1_buy_b=OrderTicket();
if(OrderComment()=="H1_buy_b")
{
if (TS < Min_Dist)
TS=Min_Dist;
{
if (NormalizeDouble(SL,Digits)< // If it is lower than we want
NormalizeDouble(Bid-TS*Point,Digits))
{
SL=Bid-TS*Point;
OrderModify(H1_buy_b,lots,SL,TP,Expiration);
}
}
}
}
}
A kérdésem az ,hogyha egyszerre több cahrton működik a robot akkor több pozíció is létrejöhet egyszerre, akkor hogyan lehetne a megbízásokat külön külön kezelni?
Mert ugye azt nem lehet előre tudni, hogy milyen sorrendben jönnek létre a pozíciók. (Pl:. EUR-USD én léterjön az első pozi "H1_buy_a" néven, utána létre jön a második pozi de az nem a" H1_buy_b" nevű lessz hanem egy NZD-USD charton létrejövő pozi amit "NZDUSD_H1_buy_a"-nak nevezek el és majd csak ezután jön létre az EUR-USD-én a "H1_buy_b" nevű pozi.) Erre nem tudok praktikus megoldást találni:
for(i=?;i<=OrdersTotal();i++)
{
if(OrderSelect(i-?,SELECT_BY_POS))
{Segítségedet előre is köszönöm!
1) A for ciklus OrdersTotal() (és MT4-ben szinte minden beépített index esetén) nullától indul, nem 1-től. Erre nagyon figyelj, mert így mindig kimarad egy-egy pozíció.
Helyesen tehát: for (i=0;i
A lényeg, hogy minden robot csak és kizárólag a saját magic számú pozícióit kezelje! Nagyon szépen köszönöm segítségedet.
A napokban egy újabb problémába ütköztem. A robotom 3 feltétel alapján nyithat pozíciót.
PL:.
if(…stb…){
buy_H1_a=ordersend(…stb…)}if(…stb…){
buy_H1_a=ordersend(…stb…)}if(…stb…){
buy_H1_a=ordersend(…stb…)}
//+——————————————————————+
if(OrderOpenTime()+3600<=TimeCurrent() ){
if(…stb…){
buy_H1_b=ordersend(…stb…)}if(…stb…){
buy_H1_b=ordersend(…stb…)}if(…stb…){
buy_H1_b=ordersend(…stb…)}
}
Azt szeretném megoldani hogyha teljesül az egyik feltétel és létrejön a pozíció akkor ne jöhessen létre újabb pozi, mert akkor az OrderModify nem működik helyesen a két azonos buy_H1_a nevű , vagy esetleg a két azonos buy_H1_b nevű pozi miatt.
if(OrdersTotal()==0)
{ ez azért nem jó nekem mert akkor a párhuzamosan müködő robotok nem tudnak egyszerre kereskedni.
Ha pedig különböző neveket találok ki akkor az azért nem jó mert minden egyes teljesülő feltétel esetén külön külön le kell vezetni az OrderModify és az OrderClose fügvényeket amiket nem szereténék :) mert van olyan robotom ami 20 különböző feltétel alapján dolgozik.Türelmedet és segítségedet előre is köszönöm!
if (stb1){}
if ( !stb1 && stb2 ){}
if ( !stb1 && !stb2 && stb2 ){}
//Ilyesmire gondolsz?PL:.
if(…stb1…){
buy_H1_a=ordersend(…stb…)}if(…stb2…){
buy_H1_a=ordersend(…stb…)}if(…stb3…){
buy_H1_a=ordersend(…stb…)}
Három egymástól különböző feltételek. Azt szeretném megoldani, hogy ne legyen 1nél több (buy_H1_a) nevű pozíció, mert ha 3 feltételből 2 teljesűl az nem jó mert akkor 2 (buy_H1_a) nevű pozi lesz és akkor az ordermodify nem tudja külön külön kezelni a 2 pozit az egyforma nevek miatt.if(OrdersTotal()==0) {
if(…stb1…){
buy_H1_a=ordersend(…stb…)}if(…stb2…){
buy_H1_a=ordersend(…stb…)}if(…stb3…){
buy_H1_a=ordersend(…stb…)}
}
Ebben az esetben nem lesz 1nél több buy_H1_a nevű pozi. De ezzel meg az a baj, hogy az egymással párhuzamosan működő robotok nem tudnak egyszere kereskedni mert if(OrdersTotal()==0)
Milyen feltételt kellene írni az if(OrdersTotal()==0) helyett?Igen! Ezt írtam én is. Gondolom priorizálva ill. Súlyozva is vannak a feltételek nem? Ez esetben az első if-nél ha teljesül, akkor ordersend, ha nem igaz, de a második if igaz, akkor ott köt, feltételezve, hogy az első hamis. A harmadiknál ugyanígy. Amúgy különböző elvek és/vagy experteket magic számmal lehet jól megkülönböztetni. Orderselect-el kikeresed és onnantól kezdve bármit megtehetsz az adott nyitott ügylettel. Én is most agyalok ilyesmin. Én súlyozom a feltételeket időfelbontás alapján. Minden lehetséges kötési helyzet külön magiccel, így az azonosakat egyformán tudom kezelni a magic alapján.
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.