SL na kapitale

O jezykach programowania w platformach i nie tylko.
karus123
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 07 lis 2007, 00:32

SL na kapitale

Nieprzeczytany post autor: karus123 »

Ja w prosty sposób w EA wstawić funkcję by ustawiał SL dla wszystkich aktualnie otwartych pozycji na określonym % depo. Dodam, że wszystkie będą na jednej parze

Awatar użytkownika
Mustafa
Pasjonat
Pasjonat
Posty: 777
Rejestracja: 20 lip 2010, 10:54

Re: SL na kapitale

Nieprzeczytany post autor: Mustafa »

może tak

Kod: Zaznacz cały

if( AccountEquity() / AccountBalance() < 0.5) 
{

  for(int i=(OrdersTotal()-1); i>=0; i--)
 {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if(OrderSymbol()!= Symbol()) continue;

         int cmd=OrderType();
         if(cmd==OP_BUY){
            OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),5,Violet); 
            Sleep(100);
         }
         if(cmd==OP_SELL){
            OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),5,Violet);
            Sleep(100);
         }
      }
  }

}
Nie chodzi o to czy masz rację czy nie, tylko o to, co robisz kiedy masz rację lub jak się zachowujesz jeżeli racji nie masz.

karus123
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 07 lis 2007, 00:32

Re: SL na kapitale

Nieprzeczytany post autor: karus123 »

Dzięki za od[powiedź. Ale to nie rozwiązuje problemu. Chodzi i o to by EA fizycznie ustawiał SL i po każdym nowo dodanym zleceniu przeliczał to od nowa i modyfikował SL dla wszystkich aktualnie otwartych zleceń tak by zawsze niezależnie od tego ile jest otwartych zleceń trafienie w SL kończyło się identycznym % utraty kapitału. W twoim rozwiązaniu EA zamyka sam zlecenia a przy poślizgach cenowych może nie zrobić tego w punkt. Nie uruchomi się również to zabezpieczenie w przypadku przerw w działaniu platformy.

Awatar użytkownika
adamForex
Gaduła
Gaduła
Posty: 117
Rejestracja: 28 gru 2015, 10:24

Re: SL na kapitale

Nieprzeczytany post autor: adamForex »

To może coś takiego? :idea:

Fakt, że chodzi o jedną parę trochę upraszcza sprawę. Uwzględniłem to, że na tej parze mogą być pozycje w różne strony, więc np. sl dla selli może być jednocześnie tp dla buyi.

Wrzucam kod całej strategii, ale jak masz otwarty kod tego EA do modyfikacji, to wystarczy wkleić wywołanie funkcji changeSL(). Najlepiej tam, gdzie EA wykonuje zlecenia, żeby wywoływała się tylko przy nowym zleceniu. W parametrach podaje się wartość jednego pipsa dla jednego lota na danej parze (w walucie rachunku oczywiście) i procent (1% = 0.01) balansu, bo jakim ma nastąpić sl. Można też podać magic, żeby brało pod uwagę pozycje z konkretnego EA.

Rozwiązanie do własnych modyfikacji oczywiście.

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                       realSL.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  //tu wartosc 1 pipsa na locie to 10 USD. SL ma być na 10% rachunku
   changeSL(10,0.1);

  }
//+------------------------------------------------------------------+




void changeSL(double pipValue,double percentToClose,int magic=0)
  {
   
   double totalVol = totalVolume(magic);
   double pips=(AccountBalance()*percentToClose)/(pipValue*MathAbs(totalVol));
   double priceToModify=0;

   if(Digits()>=4)
     {
      pips*=0.0001;
        }else{
      pips*=0.01;
     }
   if(totalVol > 0){
     priceToModify=NormalizeDouble(calcBE(magic) - pips,Digits);
   }else{
     priceToModify=NormalizeDouble(calcBE(magic) + pips,Digits);
   }
  Print(priceToModify);
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()!=magic || OrderType()>1) continue;

         if(OrderType()==OP_BUY)
           {
            if(OrderOpenPrice()>priceToModify)
              {
              if(!OrderModify(OrderTicket(),Ask,priceToModify,0,0))Print(GetLastError());
                 }else{
              if(!OrderModify(OrderTicket(),Ask,0,priceToModify,0))Print(GetLastError());
              }
              }else{
            if(OrderOpenPrice()>priceToModify)
              {
              if(!OrderModify(OrderTicket(),Ask,0,priceToModify,0))Print(GetLastError());
                 }else{
              if(!OrderModify(OrderTicket(),Ask,priceToModify,0,0))Print(GetLastError());
              }

           }


        }
     }

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double calcBE(int magic=0)
  {

   double BE=0;
   double priceXlots=0;
   double sumLots=0;

   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()!=magic || OrderType()>1) continue;

         if(OrderType()==OP_BUY) 
           {
            priceXlots+=OrderOpenPrice()*OrderLots();
            sumLots+=OrderLots();
              }else{
            priceXlots-=OrderOpenPrice()*OrderLots();
            sumLots-=OrderLots();
           }

        }

     }

   if(sumLots!=0)
     {
      BE=priceXlots/sumLots;
        }else{
      BE=0;
     }

   return(BE);
  }
//+------------------------------------------------------------------+


double totalVolume(int magic=0){
 double  vol = 0;
 
 for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()!=magic || OrderType()>1) continue;

         if(OrderType()==OP_BUY) 
           {
            
            vol+=OrderLots();
              }else{
            
            vol-=OrderLots();
           }

        }

     }

 return vol;
}

Awatar użytkownika
Pablo90
Pasjonat
Pasjonat
Posty: 1215
Rejestracja: 10 cze 2007, 15:36

Re: SL na kapitale

Nieprzeczytany post autor: Pablo90 »

Karus to o czym piszesz jest niemożliwe do zrobienia, tak jak napisał Adam. Jak niby EA ma się domyśleć, kiedy i na jakiej parze zostanie uderzone SL? A różnica w poślizgu między zamknięciem zlecenia za pomocą EA i SL jest pomijalna, chyba, że masz łącze bardzo złej jakości.

qrczaczek
Uczestnik
Uczestnik
Posty: 3
Rejestracja: 18 paź 2010, 21:50

Re: SL na kapitale

Nieprzeczytany post autor: qrczaczek »

Witajcie,

a gdyby napisać prosty EA, który porównuje aktualny balance z equity i jeśli equity jest niższa niż x % balansu to zamyka wszystkie pozycje ?

Czyli przykładowo:
Balance: 10.000 PLN
Equity: 8.000 PLN
ustawiona zmienna SL na 20%
EA zamyka wszystkie otwarte pozycje w momencie dojścia Equity do 8.000 PLN.

Jak myślicie ?

JAREK67
Maniak
Maniak
Posty: 2143
Rejestracja: 13 lip 2006, 11:21

Re: SL na kapitale

Nieprzeczytany post autor: JAREK67 »

qrczaczek pisze:Witajcie,

a gdyby napisać prosty EA, który porównuje aktualny balance z equity i jeśli equity jest niższa niż x % balansu to zamyka wszystkie pozycje ?

Czyli przykładowo:
Balance: 10.000 PLN
Equity: 8.000 PLN
ustawiona zmienna SL na 20%
EA zamyka wszystkie otwarte pozycje w momencie dojścia Equity do 8.000 PLN.

Jak myślicie ?
Proste i skuteczne. Od lat tego używam.

Awatar użytkownika
Mustafa
Pasjonat
Pasjonat
Posty: 777
Rejestracja: 20 lip 2010, 10:54

Re: SL na kapitale

Nieprzeczytany post autor: Mustafa »

qrczaczek pisze:Witajcie,

a gdyby napisać prosty EA, który porównuje aktualny balance z equity i jeśli equity jest niższa niż x % balansu to zamyka wszystkie pozycje ?

Czyli przykładowo:
Balance: 10.000 PLN
Equity: 8.000 PLN
ustawiona zmienna SL na 20%
EA zamyka wszystkie otwarte pozycje w momencie dojścia Equity do 8.000 PLN.

Jak myślicie ?
w drugim poście to jest napisane :p
Nie chodzi o to czy masz rację czy nie, tylko o to, co robisz kiedy masz rację lub jak się zachowujesz jeżeli racji nie masz.

Awatar użytkownika
adamForex
Gaduła
Gaduła
Posty: 117
Rejestracja: 28 gru 2015, 10:24

Re: SL na kapitale

Nieprzeczytany post autor: adamForex »

Ja ze swojej strony potwierdzam, że rozwiązanie Mustafy jest uniwersalnie najlepsze. Właściwie, gdybym sam miał korzystać z sl na kapitale, to zrobiłbym to właśnie tak.

Ma to wiele zalet, broker nie widzi Twoich sl, rozwiązanie działa na wszystkie pary jednocześnie, jest mniej podatne na błędy itp.

Ale jak ktoś z różnych powodów potrzebuje prawdziwych sl wysyłanych na serwer, to niestety nie jest to rozwiązanie dla niego.

ODPOWIEDZ