Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1130
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Всем привет, продолжаю дорабатывать то что уже есть
Мы имеем неравномерную сетку ордеров и горизонтальную линию которая может быть в любом месте
нужно реализовать такое:
если у нас цена ниже линии закрыть все ордера
сложности заключаются в том что
1) если ордера неравномерного типа и уже при выставлении линии кроется все что угодно, а не тогда когда поставить разметить и установить (причем тогда еще надо какой то флаг вкл\откл)
2) реализация надписи справа вверху от линии по типу (если ордера закрыть по этой цене будет такой то результат по балансу, т.е уже нужно каждый тик менять отображение и также при перемещении линии, в целом аналог тп или сл при ручном размещении ордера, только плавающий и с возможностью ошибочных срабатываний изначально)
робот есть, кроме числовой метки уже все нарисовано, вопрос в правильном присвоении значений и обработке информации всей сетки.
Вот это посмотри, может подойдёт.
Здравствуйте. Не пойму почему iTime иногда выдаёт неправильное время. На открытие новой свечи PERIOD_Н1 должно показаться время в журнале 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. Есть пример автоматического обновления (загрузки новой версии) эксперта на работающем графике?