//*********************Ф-ия обработки ошибок*************************| 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.Expert Advisor、Indicators、Scriptを端末間で同期させる便利なツールはありますか?(例えば、私は1つの端末でプログラムを作成し、その後、Expert Advisorを私が取引する端末に送信する必要があります)。
2.作業中のチャートでEAを自動更新(新バージョン読み込み)する例はありますか?