1) 주문이 고르지 않은 유형이고 선을 배치할 때 숨겨진 것이 있고 배치, 표시 및 설정이 아닌 경우(그런 다음에도 여전히 어떤 종류의 플래그를 설정/해제해야 함)
2) 유형별로 라인 상단의 오른쪽에 있는 비문 구현(주문이 이 가격으로 마감된 경우 결과는 잔액에 따라 결정됩니다. 즉, 매 틱마다 디스플레이를 변경해야 하며 또한 언제 일반적으로 수동으로 주문할 때 tp 또는 sl과 유사하게 라인을 이동하고 처음에는 가양성(false positive) 가능성이 있는 유동만 있음)
로봇이 있지만 모든 것이 이미 그려진 숫자 레이블을 제외하고 문제는 값의 올바른 할당과 전체 그리드의 정보 처리에 있습니다.
Nauris Zukas : 안녕하세요. iTime이 때때로 잘못된 시간을 제공하는 이유를 이해하지 못합니다. 새 PERIOD_H1 양초를 열면 Print(iTime(NULL, PERIOD_M1 ,30)) 로그에 시간이 표시되어야 합니다. 테스트에서는 모든 것이 올바르게 표시되지만 실제 생활에서는 시간이 몇 시간씩 차이가 나는 경우도 있습니다. 왜 그런 겁니까?
비탈리 무지첸코 :
CopyTime사용
datetime TM[]; if ( CopyTime ( Symbol (), Period (), 0 , 1 ,TM)< 0 ) return ; TIME0=TM[ 0 ];
//********************Закрытие ордеров*******************************| 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 ; elseif ( 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 ; } // Повторная попытка elseif (FE == 0 ) { Print ( "Неудачная попытка CloseOrder Error = " , GetLastError ()); return ;} else { Print ( "Неудачная попытка CloseOrder" ); return ; } } } // Цикл while(c < 8) } } } //for return ; } //******************************************************************|
//*********************Ф-ия обработки ошибок*************************| 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 ); // Выход из функции } } //******************************************************************|
안녕하세요 여러분, 저는 이미 존재하는 것을 계속해서 다듬고 있습니다.
우리는 고르지 않은 주문 그리드와 어디에나 있을 수 있는 수평선 을 가지고 있습니다.
이것을 구현해야 합니다.
가격이 선 아래에 있으면 모든 주문을 닫으십시오.
어려움은
1) 주문이 고르지 않은 유형이고 선을 배치할 때 숨겨진 것이 있고 배치, 표시 및 설정이 아닌 경우(그런 다음에도 여전히 어떤 종류의 플래그를 설정/해제해야 함)
2) 유형별로 라인 상단의 오른쪽에 있는 비문 구현(주문이 이 가격으로 마감된 경우 결과는 잔액에 따라 결정됩니다. 즉, 매 틱마다 디스플레이를 변경해야 하며 또한 언제 일반적으로 수동으로 주문할 때 tp 또는 sl과 유사하게 라인을 이동하고 처음에는 가양성(false positive) 가능성이 있는 유동만 있음)
로봇이 있지만 모든 것이 이미 그려진 숫자 레이블을 제외하고 문제는 값의 올바른 할당과 전체 그리드의 정보 처리에 있습니다.
이것을보십시오. 작동 할 수 있습니다.
안녕하세요. iTime이 때때로 잘못된 시간을 제공하는 이유를 이해하지 못합니다. 새 PERIOD_H1 양초를 열면 Print(iTime(NULL, PERIOD_M1 ,30)) 로그에 시간이 표시되어야 합니다. 테스트에서는 모든 것이 올바르게 표시되지만 실제 생활에서는 시간이 몇 시간씩 차이가 나는 경우도 있습니다. 왜 그런 겁니까?
CopyTime 사용
if ( CopyTime ( Symbol (), Period (), 0 , 1 ,TM)< 0 ) return ;
TIME0=TM[ 0 ];
생각하고 RefreshRates()를 넣으면. 이것도 도움이 될까요?
나는 그것을 시도하지 않았고 즉시 일반적인 범용 솔루션을 적용하고 문제를 잊어 버렸습니다.
예, 필요한 것에 대해 4ku 미만으로 끝내기 위해 알아내는 것만 남아 있습니다.
//| 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. 작업 차트에 Expert Advisor의 자동 업데이트 (새 버전 로드)의 예가 있습니까?