//*********************Ф-ия обработки ошибок*************************| int Fun_Error(int error) { switch(error) { // Преодолимые ошибки case0: return(1); case4: //Print("Торговый сервер занят. Пробуем ещё раз..."); Sleep(500); // Простое решение return(1); // Выход из функции case128: //Истек срок ожидания совершения сделки return(1); case6: //Print("Нет связи с торговым сервером. Пробуем ещё раз..."); Sleep(10000); // Простое решение return(1); // Выход из функции case129: //Print("Цена изменилась. Пробуем ещё раз..."); return(1); // Выход из функции case132: //Print("Рынок закрыт. Пробуем ещё раз..."); Sleep(123000); // Простое решение return(1); // Выход из функции case135: //Print("Цена изменилась. Пробуем ещё раз..."); RefreshRates(); // Обновим данные return(1); // Выход из функции case136: //Print("Нет цен. Ждём новый тик..."); while(RefreshRates()==false) // До нового тика Sleep(1); // Задержка в цикле return(1); // Выход из функции case137: //Print("Брокер занят. Пробуем ещё раз..."); Sleep(500); // Простое решение return(1); // Выход из функции case138: //Print("Новые цены. Пробуем ещё раз..."); Sleep(1); // Задержка в цикле return(1); // Выход из функции case146: //Print("Подсистема торговли занята. Пробуем ещё..."); Sleep(500); // Простое решение return(1); // Выход из функции case4107: //Print("Неправильный параметр цены для торговой функции. Пробуем ещё..."); Sleep(50); // Простое решение return(1); // Выход из функции // Критические ошибки case1: return(0); case2: Alert("Общая ошибка. Перегрузите терминал и\или компьютер."); return(0); // Выход из функции case5: Alert("Старая версия терминала."); //Work=false; // Больше не работать return(0); // Выход из функции case64: Alert("Счет заблокирован."); //Work=false; // Больше не работать return(0); // Выход из функции case130: //Alert("Неправильные стопы."); return(0); // Выход из функции case133: Alert("Торговля запрещена."); return(0); // Выход из функции case134: Alert("Недостаточно денег для совершения операции."); return(0); // Выход из функции case4051: Alert("Недопустимое значение параметра функции."); return(0); // Выход из функции case4108: Alert("Неверный номер тикета."); return(0); // Выход из функции default: //Print("Возникла ошибка ",Error); // Другие варианты return(0); // Выход из функции } }//******************************************************************|
//****************expert deinitialization function*******************| int deinit() { ObjectDelete("StopBuy"); ObjectDelete("StopSel"); return(0); }//******************************************************************|
大家好,只是继续完善我们已经有的东西
我们有一个不规则的订单网格和一条水平线,它可以在任何地方
我们需要落实这一点。
如果价格低于该线,则关闭所有订单
困难有以下几点
1)如果订单是非统一类型的,并且在设置线的时候已经完成了一切,而不是在我们打上标记和设置线的时候(在这种情况下,我们也应该设置开/关标志)。
2) 按类型在线的右上方实施铭文(如果订单在这个价格被关闭,结果对余额来说是一样的,也就是说,我们必须改变每一个刻度的显示,在移动线的时候也是如此;如果是手动下单,它一般类似于拖曳止损或sl,只是浮动的,最初有可能出现错误的触发)
机器人就在那里,除了数字标签,一切都已经画好了,问题是在正确的赋值和整个网格的信息处理。
看看这个,也许它适合。
你好。我不明白为什么iTime有时会给出错误的时间。新蜡烛的开盘PERIOD_H1应该在日志中显示时间 Print(iTime(NULL,PERIOD_M1,30))。在测试中,它能正确显示一切,但在现实中,时间有时甚至相差几个小时。为什么会这样呢?
使用CopyTime,我在构建图形对象时也注意到这个问题,CopyTime 解决了这个问题
if(CopyTime(Symbol(),Period(),0,1,TM)<0) return;
TIME0=TM[0];
我想知道是否可以把RefreshRates()放进去。也许这也会有帮助?
我没有尝试,一下子应用了普通的通用解决方案,就把这个问题忘了。
是的,这大致是我所需要的,现在我只需要弄清楚如何升级到4。
//| 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);
}//******************************************************************|
好吧,为了有趣起见,我将在一个终端上使用RefreshRates(),在另一个终端上使用CopyTime。
时间偏移问题在测试器中显示得很好,所以RefreshRates可能没有帮助。
1.是否有任何方便的工具可以在终端之间同步专家顾问、指标和脚本?(例如,我在一个终端上编程,然后我需要将专家顾问发送到我交易的终端上)
2.是否有一个在工作图表上自动更新(加载新版本)EA的例子?