EA close loss by eqiuty
EA close loss by eqiuty
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?
Re: EA close loss by eqiuty
Może to(druga odpowiedź, post cja i plik Equity EA nmc.ex4): https://www.forexfactory.com/showthread.php?t=509772sabus18 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?
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
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.
Daniel 12:12 Blessed is he that waiteth, and cometh to the thousand three hundred and five and thirty days.
Re: EA close loss by eqiuty
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.
Możesz zobaczyć teraz w testerze jak to działa 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.
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
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);
}
}
}
}
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);
}
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);
}
}
}
}
}