EA close loss by eqiuty

O jezykach programowania w platformach i nie tylko.
sabus18
Stały bywalec
Stały bywalec
Posty: 26
Rejestracja: 15 cze 2015, 11:20

EA close loss by eqiuty

Nieprzeczytany post autor: sabus18 »

Witajcie. Szukam z marnym skutkiem EA, które będzie zamykać wszystkie pozycje, jeżeli strata według EQUITY dojdzie do określonego poziomu- kwotowo. Czy np. mam balance 100k, kiedy equity będzie 95k to zamknie wszystkie pozycje. Nie interesuje mnie EA które to robi procentowo. Ma ktoś takie cudo? :)

Awatar użytkownika
xhDog
Pasjonat
Pasjonat
Posty: 935
Rejestracja: 05 cze 2014, 18:25

Re: EA close loss by eqiuty

Nieprzeczytany post autor: xhDog »

sabus18 pisze:Witajcie. Szukam z marnym skutkiem EA, które będzie zamykać wszystkie pozycje, jeżeli strata według EQUITY dojdzie do określonego poziomu- kwotowo. Czy np. mam balance 100k, kiedy equity będzie 95k to zamknie wszystkie pozycje. Nie interesuje mnie EA które to robi procentowo. Ma ktoś takie cudo? :)
Może to(druga odpowiedź, post cja i plik Equity EA nmc.ex4): https://www.forexfactory.com/showthread.php?t=509772

W ustawieniach wpisujesz poziomy equity i jeżeli poziom zostanie osiągnięty, to masz do wyboru:
- tylko alarm
- tylko zamknięcie wszystkich pozycji
- alarm i zamknięcie wszystkich pozycji

Chyba o to ci chodzi?

Nie testowałem tego i nie wiem jak i czy działa :D
trzeba mieć jaja jak super saiyan

Daniel 12:12 Blessed is he that waiteth, and cometh to the thousand three hundred and five and thirty days.

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: EA close loss by eqiuty

Nieprzeczytany post autor: -rookie- »

Wrzucę coś innego, żeby zachęcić cię do nauki kodowania swoich EA, bo to co chcesz to jest najprostsze co można zrobić, ponieważ wystarczy sprawdzić tylko warunek czy equity < od jakiegoś poziomu który sobie ustalisz i dać funkcje które zamknie pozycje. Kwestia czy chcesz zamknąć wszystkie czy tylko na danym instrumencie...

Więc wystarczy że włączysz kreatora do robienia EA, wkleisz ten kod i ustawisz zamiast (extern double LIMIT = 9500;) swoją wartość na której ma zamknąć wszystkie pozycje.

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                   EACloseByPL26082018_simple.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double LIMIT = 9500; // Jeśli equity wynosi 10,000 to ustalamy poziom na którym pozycje mają zostać zamknięte

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
//---
   
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
//---
   if (AccountEquity() < LIMIT) {
      manuallyCloseOrder();
   }
}
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) {}
//+------------------------------------------------------------------+

void manuallyCloseOrder() {
   for(int i=OrdersTotal(); i>=0; i--) {
      if(OrderSelect(i, SELECT_BY_POS)==true) {
         if (OrderType() == 0) {
            OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 0, clrNONE);
         } else if (OrderType() == 1) {
            OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 0, clrNONE);
         }
      }
   }
}
Możesz zobaczyć teraz w testerze jak to działa :p Masz tutaj opis o co chodzi, zrobiłem kilka funkcji i wrzuciłem to jako napisy na wykres więc możesz potem złożyć z tego swoje EA, spróbować zakodować swoje informacje albo funkcje https://images92.fotosik.pl/25/d26a2241ff30322d.png
Zrób kolejny plik w generatorze EA, nazwij go "EACloseByPL26082018", następnie wklej ten kod który jest poniżej, skompiluj i włącz tester EA. Tylko najpierw ustaw startowy depozyt itp w ustawieniach testów, a następnie w tej linii gdzie jest (extern double LIMIT = 9500;) czyli u samej góry wstaw swój limit na którym ma zamykać pozycje, a potem otwieraj pozycje i testuj czy to działa i jak.

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                          EACloseByPL26082018.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern int MagicNumber = 100;
extern int Slippage = 3;
extern double LotSize = 0.1;
int counter = 0;

extern double LIMIT = 9500;
extern double MAXIMUMLOSS = 500;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   createBUYButton();
   createSELLButton();
   createCLOSEButton(); 
   createBalanceInfoLabel();
   createEquityInfoLabel(); 
   createEditLabel();
   createDistanceToLimitInfoLabel();
   createExposureInfoLabel();
   createPositionSizeInfoLabel();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectDelete("btnBUY");
   ObjectDelete("btnSELL");
   ObjectDelete("btnCLOSE");
   ObjectDelete("balanceLabel");
   ObjectDelete("equityLabel");
   ObjectDelete("edit");
   ObjectDelete("distanceToLimit");
   ObjectDelete("exposureLabel");
   ObjectDelete("posSizeLabel");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
   if (AccountEquity() < LIMIT) {
      manuallyCloseOrder();
   }
   
   if (AccountEquity() < (AccountBalance()-MAXIMUMLOSS)) {
      //manuallyCloseOrder();
   }   
   
   // update chart info 
   ObjectSetString(ChartID(), "equityLabel",OBJPROP_TEXT, DoubleToStr(AccountEquity(),2));
   ObjectSetString(ChartID(), "balanceLabel",OBJPROP_TEXT, DoubleToStr(AccountBalance(),2));
   ObjectSetString(ChartID(), "distanceToLimit",OBJPROP_TEXT, DoubleToStr(AccountEquity()-LIMIT,2));
   ObjectSetString(ChartID(), "exposureLabel",OBJPROP_TEXT, DoubleToStr(calcLotSize(),2));
   ObjectSetString(ChartID(), "posSizeLabel",OBJPROP_TEXT, DoubleToStr(ObjectGetString(ChartID(), "edit", OBJPROP_TEXT, 0),2));
   LotSize = StrToDouble(ObjectGetString(ChartID(), "edit", OBJPROP_TEXT, 0));
   
   //Print( StrToDouble(ObjectGetString(ChartID(), "edit", OBJPROP_TEXT, 0)) );
   
   if (IsTesting()) {
      if(ObjectGetInteger(ChartID(),"btnBUY",OBJPROP_STATE)==true) {
         sendBuyOrder();
         ObjectSetInteger(ChartID(),"btnBUY",OBJPROP_STATE,false);
      }
      if(ObjectGetInteger(ChartID(),"btnSELL",OBJPROP_STATE)==true) {
         sendSellOrder();
         ObjectSetInteger(ChartID(),"btnSELL",OBJPROP_STATE,false);
      }
      if(ObjectGetInteger(ChartID(),"btnCLOSE",OBJPROP_STATE)==true) {
         manuallyCloseOrder();
         ObjectSetInteger(ChartID(),"btnCLOSE",OBJPROP_STATE,false);
      }
   }
   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   
  }
//+------------------------------------------------------------------+

void createBUYButton() {
   ObjectCreate(ChartID(), "btnBUY", OBJ_BUTTON, 0 ,0, 0);
   ObjectSetInteger(ChartID(), "btnBUY",OBJPROP_XDISTANCE,100);
   ObjectSetInteger(ChartID(), "btnBUY",OBJPROP_YDISTANCE,100);
   ObjectSetString(ChartID(), "btnBUY",OBJPROP_TEXT,"buy");
}

void createSELLButton() {
   ObjectCreate(ChartID(), "btnSELL", OBJ_BUTTON, 0 ,0, 0);
   ObjectSetInteger(ChartID(), "btnSELL",OBJPROP_XDISTANCE,200);
   ObjectSetInteger(ChartID(), "btnSELL",OBJPROP_YDISTANCE,100);
   ObjectSetString(ChartID(), "btnSELL",OBJPROP_TEXT,"sell");
}

void createCLOSEButton() {
   ObjectCreate(ChartID(), "btnCLOSE", OBJ_BUTTON, 0 ,0, 0);
   ObjectSetInteger(ChartID(), "btnCLOSE",OBJPROP_XDISTANCE,150);
   ObjectSetInteger(ChartID(), "btnCLOSE",OBJPROP_YDISTANCE,200);
   ObjectSetString(ChartID(), "btnCLOSE",OBJPROP_TEXT,"CLOSE");
}

void sendBuyOrder() {
   OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, 0, 0,"Buy[" + counter +"]", MagicNumber, 0, clrGreen);
   counter++;
}

void sendSellOrder() {
   OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, 0, 0,"Sell[" + counter +"]", MagicNumber, 0, clrRed);
   counter++;
}

void manuallyCloseOrder() {
   for(int i=OrdersTotal(); i>=0; i--) {
      if(OrderSelect(i, SELECT_BY_POS)==true) {
         if (OrderType() == 0) {
            OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 0, clrNONE);
         } else if (OrderType() == 1) {
            OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 0, clrNONE);
         }
      }
   }
}

void createBalanceInfoLabel() {
   ObjectCreate(ChartID(), "balanceLabel", OBJ_LABEL, 0 ,0, 0);
   ObjectSetInteger(ChartID(), "balanceLabel",OBJPROP_XDISTANCE,400);
   ObjectSetInteger(ChartID(), "balanceLabel",OBJPROP_YDISTANCE,50);
   ObjectSetString(ChartID(), "balanceLabel",OBJPROP_TEXT, DoubleToStr(AccountBalance(),2));
   ObjectSetInteger(ChartID(), "balanceLabel",OBJPROP_FONTSIZE, 24);
   ObjectSetInteger(ChartID(), "balanceLabel",OBJPROP_COLOR, clrWheat);
}

void createEquityInfoLabel() {
   ObjectCreate(ChartID(), "equityLabel", OBJ_LABEL, 0 ,0, 0);
   ObjectSetInteger(ChartID(), "equityLabel",OBJPROP_XDISTANCE,400);
   ObjectSetInteger(ChartID(), "equityLabel",OBJPROP_YDISTANCE,100);
   ObjectSetString(ChartID(), "equityLabel",OBJPROP_TEXT, DoubleToStr(AccountEquity(),2));
   ObjectSetInteger(ChartID(), "equityLabel",OBJPROP_FONTSIZE, 24);
   ObjectSetInteger(ChartID(), "equityLabel",OBJPROP_COLOR, clrWhite);
}

void createDistanceToLimitInfoLabel() {
   ObjectCreate(ChartID(), "distanceToLimit", OBJ_LABEL, 0 ,0, 0);
   ObjectSetInteger(ChartID(), "distanceToLimit",OBJPROP_XDISTANCE,400);
   ObjectSetInteger(ChartID(), "distanceToLimit",OBJPROP_YDISTANCE,150);
   ObjectSetString(ChartID(), "distanceToLimit",OBJPROP_TEXT, DoubleToStr(AccountEquity()-LIMIT,2));
   ObjectSetInteger(ChartID(), "distanceToLimit",OBJPROP_FONTSIZE, 24);
   ObjectSetInteger(ChartID(), "distanceToLimit",OBJPROP_COLOR, clrWhite);
}

void createEditLabel() {
   ObjectCreate(ChartID(), "edit", OBJ_EDIT, 0 ,0, 0);
   ObjectSetInteger(ChartID(), "edit",OBJPROP_XDISTANCE,400);
   ObjectSetInteger(ChartID(), "edit",OBJPROP_YDISTANCE,300);
   ObjectSetInteger(ChartID(), "edit",OBJPROP_BGCOLOR, clrYellow);
   ObjectSetString(ChartID(), "edit",OBJPROP_TEXT, DoubleToStr(LotSize,2));
}

void createExposureInfoLabel() {
   ObjectCreate(ChartID(), "exposureLabel", OBJ_LABEL, 0 ,0, 0);
   ObjectSetInteger(ChartID(), "exposureLabel",OBJPROP_XDISTANCE,400);
   ObjectSetInteger(ChartID(), "exposureLabel",OBJPROP_YDISTANCE,200);
   ObjectSetString(ChartID(), "exposureLabel",OBJPROP_TEXT, DoubleToStr(calcLotSize(),2));
   ObjectSetInteger(ChartID(), "exposureLabel",OBJPROP_FONTSIZE, 24);
   ObjectSetInteger(ChartID(), "exposureLabel",OBJPROP_COLOR, clrAqua);
}

double calcLotSize() {
   double res = 0;
   for(int i=OrdersTotal(); i>=0; i--) {
      if(OrderSelect(i, SELECT_BY_POS)==true) {
         if (OrderType() == 0) {
            res = res += OrderLots(); 
         } else if (OrderType() == 1) {
            res = res -= OrderLots();
         }
      }
   }
   return NormalizeDouble(res,2);
}

void createPositionSizeInfoLabel() {
   ObjectCreate(ChartID(), "posSizeLabel", OBJ_LABEL, 0 ,0, 0);
   ObjectSetInteger(ChartID(), "posSizeLabel",OBJPROP_XDISTANCE,50);
   ObjectSetInteger(ChartID(), "posSizeLabel",OBJPROP_YDISTANCE,25);
   ObjectSetString(ChartID(), "posSizeLabel",OBJPROP_TEXT, DoubleToStr(LotSize,2));
   ObjectSetInteger(ChartID(), "posSizeLabel",OBJPROP_FONTSIZE, 24);
   ObjectSetInteger(ChartID(), "posSizeLabel",OBJPROP_COLOR, clrCadetBlue);
}
Akurat tutaj masz wersje funkcji która zamyka wszystkie otwarte, ale możesz też zamknąć tylko według instrumentu dodając instrukcje warunkową if (Symbol() == OrderSymbol()) która sprawdza tylko jakiś konkretny instrument, i zamiast Symbol() dajesz np "EURUSD" ---> https://docs.mql4.com/trading/ordersymbol

Kod: Zaznacz cały

void manuallyCloseOrder() {
   for(int i=OrdersTotal(); i>=0; i--) {
      if(OrderSelect(i, SELECT_BY_POS)==true) {
         if (Symbol() == OrderSymbol()) {
            if (OrderType() == 0) {
               OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 0, clrNONE);
            } else if (OrderType() == 1) {
               OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 0, clrNONE);
            }
         }
      }
   }
}

ODPOWIEDZ