http://zakaz.opentraders.ru/47394.html
Просьба написать советник для платформы мт5!
//+----------------------------------------------------------------------------+
//| b-Positions.mqh |
//| |
//| Ким Игорь В. aka KimIV |
//| http://www.kimiv.ru |
//| |
//| 08.11.2006 Библиотека функций для работы с позициями. |
//+----------------------------------------------------------------------------+
#property library
// ClosePosBySelect Закрытие одной предварительно выбранной позиции
// ClosePosBySizeLossInCurrency Закрытие тех позиций, у которых убыток в валюте депозита превысил некоторое значение
// ClosePosBySizeProfitInCurrency Закрытие тех позиций, у которых профит в валюте депозита превысил некоторое значение
// ClosePosBySortLots Закрытие позиций в порядке сортировки по размерам лотов
// ClosePosExceptTicket Закрытие позиций по рыночной цене за исключением одной с переданным тикетом
// ClosePosFirstProfit Закрытие позиций по рыночной цене сначала прибыльных
// ClosePositions Закрытие позиций по рыночной цене
// ClosePosWithMaxProfitInCurrency Закрытие позиции с максимальным положительным профитом в валюте депозита
// DistMarketAndPos Расстояние в пунктах между рынком и ближайшей позицей
// ExistInHistoryCloseBetween Существование в истории позиции или ордера, закрытой (удалённого) между датами.
// ExistInHistoryOpenBetween Существование в истории позиции или ордера, открытой (установленного) между датами.
// ExistInHistoryToDay Существование ордера или позиции в истории за сегодня
// ExistOPNearMarket Существование позиции или ордера около рынка
// ExistPosByPrice Существование позиций по цене открытия
// ExistPositions Существование позиций
// GetAmountLotFromOpenPos Сумма лотов открытых позиций
// GetIndexLastPos Индекс последней открытой позиции или -1
// GetLotLastClosePos Возвращает размер лота последней закрытой позиции или -1
// GetLotLastPos Возвращает размер лота последней открытой позиции или -1
// GetMaxLotFromOpenPos Максимальный размер лота из открытых позиций
// GetMinLotFromOpenPos Минимальный размер лота из открытых позиций
// GetProfitFromDateInCurrency Суммарный профит в валюте депозита закрытых с определённой даты позиций
// GetProfitOpenPosInCurrency Суммарный профит открытых позиций в валюте депозита
// GetProfitOpenPosInPoint Суммарный профит открытых позиций в пунктах
// GetTicketLastPos Тикет последней открытой позиции или -1
// GetTypeLastClosePos Тип последней закрытой позиции или -1
// GetTypeLastOpenPos Тип последней открытой позиции или -1
// isCloseLastPosByStop Флаг закрытия последней позиции по стопу
// isCloseLastPosByTake Флаг закрытия последней позиции по тейку
// isLossLastPos Флаг убыточности последней позиции
// isTradeToDay Возвращает флаг торгов сегодня
// MovingInWL Перенос уровня стопа в безубыток
// NumberOfBarCloseLastPos Номер бара закрытия последней позиции или -1
// NumberOfBarOpenLastPos Номер бара открытия последней позиции или -1
// NumberOfLossPosToday Количество убыточных позиций, закрытых сегодня
// NumberOfPositions Количество позиций
// OpenPosition Открытие позиции
// PriceCloseLastPos Цена закрытия последней закрытой позиций
// PriceOpenLastClosePos Цена открытия последней закрытой позиций
// PriceOpenLastPos Цена открытия последней открытой позиций
// PriceOpenNearPos Цена открытия ближайшей позиции
// SecondsAfterCloseLastPos Количество секунд после закрытия последней позиций
// SecondsAfterOpenLastPos Количество секунд после открытия последней позиций
// SimpleTrailing Сопровождение позиций простым тралом
// TakeProfitLastClosePos Возвращает цену TakeProfit последней закрытой позиций или -1
// TakeProfitLastPos Возвращает цену TakeProfit последней открытой позиций или -1
// TicketNearPos Тикет ближайшей к рынку позиции по цене открытия или 0
// TimeOpenLastPos Время открытия последней открытой позиций
// TypeNearPos Возвращает тип ближайшей к рынку позиции или -1
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает время открытия последней открытой позиций. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" - любой символ, |
//| NULL - текущий символ) |
//| op - операция (-1 - любая позиция) |
//| mn - MagicNumber (-1 - любой магик) |
//+----------------------------------------------------------------------------+
datetime TimeOpenLastPos(string sy="", int op=-1, int mn=-1) {
datetime t;
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderOpenTime()) t=OrderOpenTime();
}
}
}
}
}
}
return(t);
}
//-------------------------------------------------------------------------
bool SendOrder(int tip, double lot, string com)
{
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderComment()==com) return(0);
}
}
}
int error,nn;
while(true)
{
RefreshRates();
if (tip==OP_BUY) error = OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,Digits),slippage,0,0,com,Magic,0,Blue);
if (tip==OP_SELL) error = OrderSend(Symbol(),OP_SELL,lot,NormalizeDouble(Bid,Digits),slippage,0,0,com,Magic,0,Red);
if (error==-1)
{
Print("OrderSend Error ",GetLastError()," Lot ",lot);
Sleep(1000);
}
else return(1);
nn++;
if (nn>10) return(0);
}
return(1);
}
//-------------------------------------------------------------------
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 10.04.2008 |
//| Описание : Открывает позицию по рыночной цене. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента (NULL или "" - текущий символ) |
//| op - операция |
//| ll - лот |
//| sl - уровень стоп |
//| tp - уровень тейк |
//| mn - MagicNumber |
//| co - комментарий |
//+----------------------------------------------------------------------------+
void OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0, string co="") {
color clOpen;
datetime ot;
double pp, pa, pb;
int dg, err, it, ticket=0;
if (sy=="" || sy=="0") sy=Symbol();
if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell;
if (co=="") co=WindowExpertName()+" "+GetNameTF(Period());
for (it=1; it<=NumberOfTry; it++) {
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
Print("OpenPosition(): Остановка работы функции");
break;
}
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
dg=MarketInfo(sy, MODE_DIGITS);
pa=MarketInfo(sy, MODE_ASK);
pb=MarketInfo(sy, MODE_BID);
if (op==OP_BUY) pp=pa; else pp=pb;
pp=NormalizeDouble(pp, dg);
ot=TimeCurrent();
if (MarketWatch)
ticket=OrderSend(sy, op, ll, pp, Slippage, 0, 0, co, mn, 0, clOpen);
else
ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, co, mn, 0, clOpen);
if (ticket>0) {
if (UseSound) PlaySound(SoundSuccess); break;
} else {
err=GetLastError();
if (UseSound) PlaySound(SoundError);
if (pa==0 && pb==0) Message("Проверьте в Обзоре рынка наличие символа "+sy);
// Вывод сообщения об ошибке
Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);
Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op),
" pp=",pp," sl=",sl," tp=",tp," mn=",mn);
// Блокировка работы советника
if (err==2 || err==64 || err==65 || err==133) {
gbDisabled=True; break;
}
// Длительная пауза
if (err==4 || err==131 || err==132) {
Sleep(1000*300); break;
}
if (err==128 || err==142 || err==143) {
Sleep(1000*66.666);
if (ExistPositions(sy, op, mn, ot)) {
if (UseSound) PlaySound(SoundSuccess); break;
}
}
if (err==140 || err==148 || err==4110 || err==4111) break;
if (err==141) Sleep(1000*100);
if (err==145) Sleep(1000*17);
if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
if (err!=135 && err!=138) Sleep(1000*7.7);
}
}
if (MarketWatch && ticket>0 && (sl>0 || tp>0)) {
if (OrderSelect(ticket, SELECT_BY_TICKET)) ModifyOrder(-1, sl, tp);
}
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void comment()
{
int k=0;
string s="";
for(int i=OrdersHistoryTotal()-1; i>0; i--)
{
if(k<count)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==_Symbol)
{
s+="\n Open Time: "+(string)OrderOpenTime()+" Close Time: "+(string)OrderCloseTime()
+" Lot: "+(string)OrderLots()+" Profit: "+(string)OrderProfit()
+" All Profit: "+(string)(OrderProfit()+OrderSwap()+OrderCommission());
k++;
}
}
}
Comment(s);
}
}
//+------------------------------------------------------------------+
):
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
comment();
}
/*
Мой вариант: добавил OnTimer()
http://zakaz.opentraders.ru/55090.html#comment153103
Прошу написать скрипт, который будет отображаться на графике в левом верхнем углу
(по возможности в виде прозрачной таблицы), историю последних пяти закрытых сделок инструмента на
график которого он установлен.
История содержит:
1.дата и время открытия
2.дата и время закрытия
3.объём
4.профит или убыток в пунктах
5.профит или убыток в валюте счёта (если есть возможность с учётом свопа и комиссий)
Желательно чтоб список истории обновлялся автоматически при запуске и как только закрылся крайний ордер на инструменте.
готово: www.opentraders.ru/downloads/2718/
---Оч полезный скрипт, но сильно грузит терминал, виснет жёстко… Можно ли это как-то исправить?
*/
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "1.00"
#property strict
input int count=5;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//--- создадим таймер с периодом в 1 секунду
EventSetTimer(1);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
//--- уничтожим таймер при завершении работы
EventKillTimer();
Comment("");
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
OnTimer();
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnTimer()
{
int k=0;
string s="";
for(int i=OrdersHistoryTotal()-1; i>0; i--)
{
if(k<count)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==_Symbol)
{
s+="\n Open Time: "+(string)OrderOpenTime()+" Close Time: "+(string)OrderCloseTime()
+" Lot: "+(string)OrderLots()+" Profit: "+(string)OrderProfit()
+" All Profit: "+(string)(OrderProfit()+OrderSwap()+OrderCommission());
k++;
}
}
}
Comment(s);
}
}
//+------------------------------------------------------------------+
):
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
int m = OrderMagicNumber();
if (OrderSymbol()==Symbol() && ( Magic==m || Magic1==m ||Magic2==m ||Magic3==m ))
int m = OrderMagicNumber();
if (OrderSymbol()==Symbol() && Magic==m )
{
http://www.kimiv.ru/index.php?option=com_remository&Itemid=13&func=fileinfo&id=42
http://www.kimiv.ru/index.php?option=com_remository&Itemid=13&func=fileinfo&id=41
https://cmillion.ru/sovetnik-cm_line_revers/
strategy.opentraders.ru/28779.html.
Там почти все есть. Надо только добавить магиги для групп.
void OnTick() можно обозвать void Trade1() и сделать как функцию.Аналогично создать функцию void Trade2() со своим магиком и своими парами.
Потом свести их в void OnTick().
Просто мт5 для меня вообще «темный лес».
Посмотрите.Может решитесь.Усреднение делать не надо, но если будет буду только рад.
ssg