Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 1130
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Hallo zusammen, wir arbeiten weiter an der Verfeinerung dessen, was wir bereits haben.
Wir haben ein unregelmäßiges Raster von Aufträgen und eine horizontale Linie, die überall sein kann
Wir müssen dies umsetzen:
wenn der Preis unter der Linie liegt, alle Aufträge schließen
Die Schwierigkeiten sind wie folgt
1) wenn die Aufträge nicht einheitlich sind und bereits beim Setzen der Linie alles erledigt ist, und nicht erst, wenn wir die Markierung setzen und die Linie setzen (in diesem Fall sollten wir auch das On/Off-Flag setzen)
2) Implementierung einer Beschriftung oben rechts auf der Linie nach Typ (wenn der Auftrag zu diesem Preis geschlossen wird, ist das Ergebnis für den Saldo dasselbe, d.h. wir müssen die Anzeige bei jedem Tick und auch beim Verschieben der Linie ändern; es ist im Grunde ähnlich wie ein Trailing-Stop oder Sl, wenn der Auftrag manuell platziert wird, nur fließend und mit der Möglichkeit von fehlerhaften Auslösern am Anfang)
Der Roboter ist da, bis auf die numerische Markierung ist alles schon gezeichnet, die Frage ist die richtige Zuordnung der Werte und die Informationsverarbeitung des gesamten Rasters.
Schau dir das an, vielleicht passt es ja.
Hallo. Ich verstehe nicht, warum iTime manchmal die falsche Zeit anzeigt. Bei der Eröffnung einer neuen Kerze soll PERIOD_H1 die Zeit im Protokoll Print(iTime(NULL,PERIOD_M1,30)) anzeigen. In Tests wird alles korrekt angezeigt, aber in der Realität weicht die Zeit manchmal sogar um mehrere Stunden ab. Warum ist das so?
Verwenden SieCopyTime, ich habe dieses Problem auch beim Erstellen von grafischen Objekten bemerkt undCopyTime hat das Problem gelöst
if(CopyTime(Symbol(),Period(),0,1,TM)<0) return;
TIME0=TM[0];
Ich habe mich gefragt, ob RefreshRates() eingefügt werden könnte. Vielleicht würde es auch helfen?
Ich habe es nicht ausprobiert, sondern gleich eine normale Universallösung verwendet und das Problem vergessen.
Ja, das ist ungefähr das, was ich brauche, jetzt muss ich nur noch herausfinden, wie ich auf 4 aufrüsten kann.
//| TralingLine.mq4 |
//| Copyright © 2010, Viktorov |
//| v4forex@qip.ru |
//*******************************************************************|
#property copyright "Copyright © 2010, Viktorov"
#property link "v4forex@qip.ru"
extern int StopLevel = 7;
extern color ColorLine = IndianRed;
extern bool comment = false;
double prbuys, prsels, TICKVALUE, FixProfitBuy, FixProfitSel;
int Buy, Sel;
//****************expert initialization function*********************|
bool run = True,
Error = False;
int slip = 3;
double point,
STOPLEVEL;
int init()
{
point = Point;
if((Digits == 3 || Digits == 5))
{
point = Point*10;
slip *= 10;
}
run = True;
Error = False;
TICKVALUE = MarketInfo(Symbol(), MODE_TICKVALUE);
return(0);
}//******************************************************************|
double nd(double v){return(NormalizeDouble(v,Digits));}
string dts(double v){return(DoubleToStr(v, Digits));}
string dts2(double v){return(DoubleToStr(v, 2));}
string ttss(int v){return(TimeToStr(v,TIME_SECONDS));}
//*******************************************************************|
//| expert start function |
//*******************************************************************|
int start()
{
double nprbuys, nprsels;
CountTrades();
if(Buy > 0 && ObjectFind("StopBuy") == -1) drawline(OP_BUY);
if(Sel > 0 && ObjectFind("StopSel") == -1) drawline(OP_SELL);
if(ObjectFind("StopBuy") != -1)
nprbuys = ObjectGetValueByShift("StopBuy", 0);
if(ObjectFind("StopSel")!=-1)
nprsels = ObjectGetValueByShift("StopSel", 0);
if(nprbuys > 0 && Bid <= nprbuys)
{
CloseOrder(OP_BUY);
if(ObjectFind("StopBuy") != -1) ObjectDelete("StopBuy");
}
if(nprsels > 0 && Ask >= nprsels)
{
CloseOrder(OP_SELL);
if(ObjectFind("StopSel") != -1) ObjectDelete("StopSel");
}
FixProfit();
if(comment)
Comment("\n Текущее время ", ttss(TimeCurrent())
, "\n Ордера Buy закроются по цене ", dts(nprbuys), ". Фиксированная прибыль ", dts2(FixProfitBuy)
, "\n Ордера Sell закроются по цене ", dts(nprsels), ". Фиксированная прибыль ", dts2(FixProfitSel)
);
return(0);
}//******************************************************************|
//********************Подсчёт профита всех ордеров*******************|
void FixProfit()
{ double LineB, LineS, Profit, tv;
LineB = nd(ObjectGetValueByShift("StopBuy", 0));
LineS = nd(ObjectGetValueByShift("StopSel", 0));
tv = TICKVALUE; FixProfitBuy = 0; FixProfitSel = 0;
int Total = OrdersTotal();
for(int i = Total-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol())
{
if(OrderType() == OP_BUY && LineB > 0)
{
if(StringSubstr(Symbol(),0,3) == "USD") tv = TICKVALUE*Bid/LineB;
FixProfitBuy += (OrderCommission() + OrderSwap() + (LineB - OrderOpenPrice())*tv*OrderLots()/Point);
}
if(OrderType() == OP_SELL && LineS > 0)
{
if(StringSubstr(Symbol(),0,3) == "USD") tv = TICKVALUE*Bid/LineS;
FixProfitSel += (OrderCommission() + OrderSwap() + (OrderOpenPrice() - LineS)*tv*OrderLots()/Point);
}
}
Profit += OrderProfit();
}
}
}//******************************************************************|
//*******Подсчёт открытых ордеров OP_BUY & OP_BUYSTOP****************|
void CountTrades()
{ Buy = 0; Sel = 0;
int Total = OrdersTotal();
for(int i = 0; i < Total; i++)
{
if(OrderSelect(i, SELECT_BY_POS))
{
if(OrderSymbol() == Symbol())
{
if(OrderType() == OP_BUY) Buy++;
if(OrderType() == OP_SELL) Sel++;
}
}
}//for
}//*******************************************************|
//**********************рисование линий******************************|
void drawline(int sig)
{
double Otstup_ = StopLevel*point;
if(sig == OP_BUY)
{
prbuys = nd(iLow(NULL, 0, 1)-Otstup_);
ObjectCreate("StopBuy", OBJ_TREND, 0, Time[0]+2*Period()*60, prbuys, Time[0]+4*Period()*60, prbuys);
ObjectSet("StopBuy", OBJPROP_COLOR, ColorLine);
ObjectSet("StopBuy", OBJPROP_STYLE, STYLE_DOT);
}
if(sig == OP_SELL)
{
prsels = nd(iHigh(NULL, 0, 1)+Otstup_);
ObjectCreate("StopSel", OBJ_TREND, 0, Time[0]+2*Period()*60, prsels, Time[0]+4*Period()*60, prsels);
ObjectSet("StopSel", OBJPROP_COLOR, ColorLine);
ObjectSet("StopSel", OBJPROP_STYLE, STYLE_DOT);
}
return;
}//******************************************************************|
//********************Закрытие ордеров*******************************|
void CloseOrder(int sig)
{ double GH, FE, c = 0; bool OrdClose; int Total = OrdersTotal();
for(int i = 0; i < Total; i++)
{
OrdClose = False;
if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES) && OrderSymbol() == Symbol())
{
if(OrderType() == sig)
{
while(!OrdClose) // Цикл закрытия ордера 8 попыток
{
RefreshRates();
if(OrderType() == OP_BUY) GH = Bid;
else if(OrderType() == OP_SELL) GH = Ask;
OrdClose = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(GH, Digits), slip, CLR_NONE);
if(OrdClose) i--;
if(!OrdClose)
{
FE = Fun_Error(GetLastError());
if(FE == 1) { continue; } // Повторная попытка
else if(FE == 0) { Print("Неудачная попытка CloseOrder Error = ", GetLastError()); return;}
else { Print("Неудачная попытка CloseOrder"); return; }
}
} // Цикл while(c < 8)
}
}
}//for
return;
}//******************************************************************|
//*********************Ф-ия обработки ошибок*************************|
int Fun_Error(int error)
{
switch(error)
{ // Преодолимые ошибки
case 0: return(1);
case 4: //Print("Торговый сервер занят. Пробуем ещё раз...");
Sleep(500); // Простое решение
return(1); // Выход из функции
case 128: //Истек срок ожидания совершения сделки
return(1);
case 6: //Print("Нет связи с торговым сервером. Пробуем ещё раз...");
Sleep(10000); // Простое решение
return(1); // Выход из функции
case 129: //Print("Цена изменилась. Пробуем ещё раз...");
return(1); // Выход из функции
case 132: //Print("Рынок закрыт. Пробуем ещё раз...");
Sleep(123000); // Простое решение
return(1); // Выход из функции
case 135: //Print("Цена изменилась. Пробуем ещё раз...");
RefreshRates(); // Обновим данные
return(1); // Выход из функции
case 136: //Print("Нет цен. Ждём новый тик...");
while(RefreshRates()==false) // До нового тика
Sleep(1); // Задержка в цикле
return(1); // Выход из функции
case 137: //Print("Брокер занят. Пробуем ещё раз...");
Sleep(500); // Простое решение
return(1); // Выход из функции
case 138: //Print("Новые цены. Пробуем ещё раз...");
Sleep(1); // Задержка в цикле
return(1); // Выход из функции
case 146: //Print("Подсистема торговли занята. Пробуем ещё...");
Sleep(500); // Простое решение
return(1); // Выход из функции
case 4107: //Print("Неправильный параметр цены для торговой функции. Пробуем ещё...");
Sleep(50); // Простое решение
return(1); // Выход из функции
// Критические ошибки
case 1:
return(0);
case 2: Alert("Общая ошибка. Перегрузите терминал и\или компьютер.");
return(0); // Выход из функции
case 5: Alert("Старая версия терминала.");
//Work=false; // Больше не работать
return(0); // Выход из функции
case 64: Alert("Счет заблокирован.");
//Work=false; // Больше не работать
return(0); // Выход из функции
case 130: //Alert("Неправильные стопы.");
return(0); // Выход из функции
case 133: Alert("Торговля запрещена.");
return(0); // Выход из функции
case 134: Alert("Недостаточно денег для совершения операции.");
return(0); // Выход из функции
case 4051: Alert("Недопустимое значение параметра функции.");
return(0); // Выход из функции
case 4108: Alert("Неверный номер тикета.");
return(0); // Выход из функции
default: //Print("Возникла ошибка ",Error); // Другие варианты
return(0); // Выход из функции
}
}//******************************************************************|
//****************expert deinitialization function*******************|
int deinit()
{
ObjectDelete("StopBuy");
ObjectDelete("StopSel");
return(0);
}//******************************************************************|
OK, interessehalber werde ich auf dem einen Terminal mit RefreshRates() und auf dem anderen mit CopyTime arbeiten.
Das Problem des Zeitversatzes wurde im Testprogramm deutlich, so dass RefreshRates möglicherweise nicht helfen.
1. Gibt es ein praktisches Tool zum Synchronisieren von Expert Advisors, Indikatoren und Skripten zwischen Terminals? (z. B. programmiere ich auf einem Terminal, dann muss ich den Expert Advisor an die Terminals senden, auf denen ich handle)
2. Gibt es ein Beispiel für die automatische Aktualisierung (Laden einer neuen Version) eines EA auf einem Arbeitschart?