ich versuche mich immer weiter an neuen codes, bzw. schreibe die alten Codes um.
Ich habe versucht, meinen ersten Code mal etwas anders zu fassen und ihn so schneller zu machen.
Dazu wollte ich eigentlich die verschiedenen Orderaufgaben in eigene Funktionen schreiben.
Leider gibt der EA aktuell gar keine Order aus, geschweige denn kommuniziert irgendwie mit dem MT....Könnt ihr mir vielleicht meinen Fehler zeigen?
Code:
//+------------------------------------------------------------------+
//| Neuer Versuch neu.mq4 |
//| Korbinian Gabriel |
//| - |
//+------------------------------------------------------------------+
#property copyright "Korbinian Gabriel"
#property link "-"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
/*Idee: Wenn ATR unter bestimmten Wert ist, dann werden Trades sofort auf break even gezogen, sobald es möglich ist;
Aktuell liegt noch ein Fehler im Ordersendverfahren vor*/
//--- Extern variables
extern int Mx=0;
extern int abst=3;
extern int irsi=14;
extern int iboll=20;
extern int st1=10;
extern double st2=3.0;
extern int slippage = 100;
extern double takeprofit = 0;
extern bool autostoploss = true;
extern double manualsl = 20;
extern int magicnumber = 1;
extern double Lots = 1.0;
//--- Intern variables
int Oldbar = 0;
double st1_long = iCustom(NULL,0,"SuperTrend1",st1,st2,0,1);
double st1_short = iCustom(NULL,0,"SuperTrend1",st1,st2,0,1);
double st2_long = iCustom(NULL,0,"SuperTrend1",st1,st2,0,2);
double st2_short = iCustom(NULL,0,"SuperTrend1",st1,st2,0,2);
double BBUP = iBands(NULL,0,iboll,2,2,PRICE_CLOSE,MODE_UPPER,0);
double BBDN = iBands(NULL,0,iboll,2,2,PRICE_CLOSE,MODE_LOWER,0);
double rsi1 = iRSI(NULL,0,irsi,PRICE_CLOSE,1);
double rsi0 = iRSI(NULL,0,irsi,PRICE_CLOSE,0); // hier möglicherweise die zahl zu 2 tauschen
int autosl,stoploss;
//--- Functions
int anzTradesLong() {
int ord=0;
int total = OrdersTotal();
for(int i=0;i<=total-1;i++) {
if(OrderSelect(i,SELECT_BY_POS)
&& OrderType() == OP_BUY
&& OrderSymbol() == Symbol())
ord++;
}
return (ord);
}
int anzTradesShort() {
int ord=0;
int total = OrdersTotal();
for(int i=0;i<=total-1;i++) {
if(OrderSelect(i,SELECT_BY_POS)
&& OrderType() == OP_SELL
&& OrderSymbol() == Symbol())
ord++;
}
return (ord);
}
bool long_st(){
return st1_long < Close[1] && st1_short > Close[2];
}
bool short_st(){
return st1_long > Close[1] && st1_short < Close[2];
}
//--- Look for the orderexecution:
void execution(){
if(OrdersTotal() > 0) Print("Order successfully placed",OrderMagicNumber(),OrderStopLoss(),OrderSymbol(),OrderType());
else Print("ERROR while placing order occured!", GetLastError());
}
//Maybe rsi signal for orderopening!!
int ordersend;
void OpenLongOrderatBB(){
ordersend = OrderSend(NULL,OP_BUY,Lots,BBUP,slippage,stoploss,takeprofit,"Open Pending Long Order at upper Bollinger Band",magicnumber,0,Green);
if(ordersend == 0) Alert("OrderSend ERROR LongOrder NOT opened!", GetLastError());
if(ordersend != 0) Print("Opened LongOrder: ",OrderMagicNumber()," on ",OrderSymbol(), "Lots: ",OrderLots()," StopLoss: ",OrderStopLoss()," TakeProfit: ",OrderTakeProfit());
}
void OpenShortOrderatBB(){
ordersend = OrderSend(NULL,OP_SELL,Lots,BBDN,slippage,stoploss,takeprofit,"Open Pending Short Order at lower Bollinger Band",magicnumber,0,Red);
if(ordersend == 0) Alert("OrderSend ERROR ShortOrder NOT opened!", GetLastError());
if(ordersend != 0) Print("Opened ShortOrder: ",OrderMagicNumber()," on ",OrderSymbol(), "Lots: ",OrderLots()," StopLoss: ",OrderStopLoss()," TakeProfit: ",OrderTakeProfit());
}
void OpenLongOrderMarket(){
ordersend = OrderSend(NULL,OP_BUY,Lots,Ask,slippage,stoploss,takeprofit,"Open Market Long Order",magicnumber,0,Green);
if(ordersend == 0) Alert("OrderSend ERROR LongOrder NOT opened!", GetLastError());
if(ordersend != 0) Print("Opened LongOrder: ",OrderMagicNumber()," on ",OrderSymbol(), "Lots: ",OrderLots()," StopLoss: ",OrderStopLoss()," TakeProfit: ",OrderTakeProfit());
}
void OpenShortOrderMarket(){
ordersend = OrderSend(NULL,OP_BUY,Lots,Bid,slippage,stoploss,takeprofit,"Open Market Short Order",magicnumber,0,Red);
if(ordersend == 0) Alert("OrderSend ERROR ShortOrder NOT opened!", GetLastError());
if(ordersend != 0) Print("Opened ShortOrder: ",OrderMagicNumber()," on ",OrderSymbol(), "Lots: ",OrderLots()," StopLoss: ",OrderStopLoss()," TakeProfit: ",OrderTakeProfit());
}
//--- On expert-advisor initiation
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
int start()
{
if(Oldbar != Bars) {
//---
//---Stoplossdefinition
if(OrderType() == OP_BUY) autosl = st1_long - abst;
if(OrderType() == OP_SELL) autosl = st1_short + abst;
if(autostoploss == true) stoploss = autosl;
if(autostoploss == false) stoploss = manualsl;
//--- Initializing Orders
if(st1_long < st2_short) OpenLongOrderatBB(); execution();
if(st1_long < st2_short && Close[1] > BBUP) OpenLongOrderMarket(); execution();
if(st2_long > st1_short) OpenShortOrderatBB(); execution();
if(st2_long > st1_short && Close[1] < BBDN) OpenShortOrderMarket(); execution();
//--- Closing Orders
if(rsi1 < 30 && rsi0 > 30)
{
int total = OrdersTotal();
for(int i=0;i<=total-1;i++) {
if(OrderSelect(i,SELECT_BY_POS)) { // Part soll dafür sorgen, dass nur 1 Position pro Signal eröffnet wird.
if(OrderCommission()+OrderProfit()+OrderSwap()>0) {
Print ("Order closing now, because of RSI-Signal!");
bool result = OrderClose(OrderSelect(OrderTicket(), SELECT_BY_POS),OrderLots(),Ask,10); //Komisch: Wenn ich SELECT_BY_TICKET auswähle, funktioniert der Trailingstop nicht
if (result == true)
Print ("Orderclosing ",OrderTicket()," succeeded");
else
Print ("Orderclosing ",OrderTicket()," failed");
}
}
}
}
if(rsi1 > 70 && rsi0 < 70)
{
int total = OrdersTotal();
for(int i=0;i<=total-1;i++) {
if(OrderSelect(i,SELECT_BY_POS)) { // Part soll dafür sorgen, dass nur 1 Position pro Signal eröffnet wird.
if(OrderCommission()+OrderProfit()+OrderSwap()>0) {
Print ("Order closing now, because of RSI-Signal!");
bool result = OrderClose(OrderSelect(OrderTicket(), SELECT_BY_POS),OrderLots(),Bid,10); //Komisch: Wenn ich SELECT_BY_TICKET auswähle, funktioniert der Trailingstop nicht
if (result == true)
Print ("Orderclosing ",OrderTicket()," succeeded");
else
Print ("Orderclosing ",OrderTicket()," failed");
}
}
}
}
}
Oldbar = Bars;
return(0);
}
//+------------------------------------------------------------------+