Получить 100$ на счет бесплатно!!

Получить депозит форекс за общение на форуме Бездепозитный бонус 100$

Полезные функции от artamir

Сборник процедур/функций, чтоб не изобретать велосипед.
  
МедальКубок
Сообщений: 536
Назад

TR_ModifyTP


Модификация тейкпрофита ордера. Тейкпрофит может быть задан в пунктах от цены открытия ордера или ценовым уровнем.

[code=php]
bool TR_ModifyTP(int ticket, double tp, int mode = 1){
/*
>Ver : 0.0.2
>Date : 2012.09.20
>History:
@0.0.2@2012.09.20@artamir []
@0.0.1@2012.08.20@artamir []
>Description:
Модификация тейкпрофита ордера. Тейкпрофит может быть задан в пунктах от цены открытия ордера или ценовым уровнем.
*/
if(!OrderSelect(ticket, SELECT_BY_TICKET)) return(false);

double newtp = tp;

if(mode == TR_MODE_PIP){
int type = OrderType();
double op = OrderOpenPrice();
//--------------------------------------------------
if(type == OP_BUY || type == OP_BUYSTOP || type == OP_BUYLIMIT){
newtp = op+tp*Point;
}

//--------------------------------------------------
if(type == OP_SELL || type == OP_SELLSTOP || type == OP_SELLLIMIT){
newtp = op - tp*Point;
}
}

return(_OrderModify(ticket, -1, -1, newtp, -1, CLR_NONE));
}

[/code]
МедальКубок
Сообщений: 536
Назад

TR_ModifyPrice


Модификация цены открытия отложенного ордера. Цена задается ценовым уровнем.

[code=php]
bool TR_ModifyPrice(int ticket, double price, int mode = 1){
/**
\version 0.0.0.1
\date 2013.08.22
\author Morochin Artiom
\details Модификация цены открытия отложенного ордера. Цена задается ценовым уровнем.
\internal
>Hist:
>Rev:0
*/

//------------------------------------------------------
if(mode == TR_MODE_PRICE){
return(_OrderModify(ticket, price, -1, -1, -1, CLR_NONE));
}
}

[/code]
МедальКубок
Сообщений: 536
Назад

TR_ModifyTPByTicket


Модифицирует тейкпрофит для заданного тикета, как у тикета-источника

[code=php]
bool TR_ModifyTPByTicket(int src_ti, int dest_ti){
/*
>Ver : 0.0.1
>Date : 2013.02.11
>Hist :
>Author : Morochin Artiom
>Desc : Модифицирует тп для заданного тикета, как у тикета-источника
*/

if(!OrderSelect(src_ti, SELECT_BY_TICKET)) return(false);

//------------------------------------------------------
double src_tp = Norm_symb(OrderTakeProfit());

//------------------------------------------------------
return(TR_ModifyTP(dest_ti, src_tp));
}
[/code]
МедальКубок
Сообщений: 536
Назад

TR_ModifySL


Модификация стоплосса ордера. Стоплосс задается либо ценовым уровнем, либо количеством пунктов от цены открытия ордера.

[code=php]
bool TR_ModifySL(int ticket, double sl, int mode = 1){
/*
>Ver : 0.0.3
>Date : 2013.02.15
>History:
>Desc: Модификация стоплосса ордера. Стоплосс задается либо ценовым уровнем, либо количеством пунктов от цены открытия ордера.

*/
if(!OrderSelect(ticket, SELECT_BY_TICKET)) return(false);

double newsl = sl;

if(mode == TR_MODE_PIP){
int type = OrderType();
double op = OrderOpenPrice();
//--------------------------------------------------
if(type == OP_BUY || type == OP_BUYSTOP || type == OP_BUYLIMIT){
newsl = op-sl*Point;
}

//--------------------------------------------------
if(type == OP_SELL || type == OP_SELLSTOP || type == OP_SELLLIMIT){
newsl = op + sl*Point;
}
}

return(_OrderModify(ticket, -1, newsl, -1, -1, CLR_NONE));
}
[/code]
МедальКубок
Сообщений: 536
Назад

TR_ModifyPriceByTicket


Устанавливает цену открытия заданного тикета dest_ti как цена открытия у тикета-источника с учетом спреда.

[code=php]
bool TR_ModifyPriceByTicket(int src_ti, int dest_ti){
/*
>Ver : 0.0.3
>Date : 2013.02.26
>Hist :
>Author : Morochin Artiom
>Desc : Устанавливает цену открытия заданного тикета dest_ti как цена открытия у тикета-источника с учетом спреда.
*/

int src_ty = -1;
double src_pr = 0.0;

int dest_ty = -1;
double dest_pr = 0.0;

int addSPREAD = 0;

int SPREAD = MarketInfo(Symbol(), MODE_SPREAD);

if(!OrderSelect(src_ti, SELECT_BY_TICKET)) return(false);

src_ty = OrderType();
src_pr = OrderOpenPrice();

if(!OrderSelect(dest_ti, SELECT_BY_TICKET)) return(false);

dest_ty = OrderType();

if(src_ty == OP_BUY){
if(dest_ty == OP_SELLLIMIT){
addSPREAD = -SPREAD;
}

}

if(src_ty == OP_SELL){
if(dest_ty == OP_BUYLIMIT){
addSPREAD = SPREAD;
}
}

if(src_ty == OP_BUYLIMIT){
if(dest_ty == OP_SELLSTOP){
addSPREAD = -SPREAD;
}
}

if(src_ty == OP_SELLLIMIT){
if(dest_ty == OP_BUYSTOP){
addSPREAD = SPREAD;
}
}

if(src_ty == OP_BUYSTOP){
if(dest_ty == OP_SELLLIMIT){
addSPREAD = -SPREAD;
}
}

if(src_ty == OP_SELLSTOP){
if(dest_ty == OP_BUYLIMIT){
addSPREAD = SPREAD;
}
}

return(TR_ModifyPrice(dest_ti, src_pr+addSPREAD*Point));
}

[/code]
МедальКубок
Сообщений: 536
Назад

TR_ModifySLOnTP


Устанавливает стоплосс дл тикета dest_ti на ценовой уровень тейкпрофита тикета src_ti с учетом спреда

[code=php]
bool TR_ModifySLOnTP(int src_ti, int dest_ti){
/*
>Ver : 0.0.1
>Date : 2013.02.23
>Hist :
>Author : Morochin Artiom
>Desc : Устанавливает стоплосс дл тикета dest_ti на ценовой уровень тейкпрофита тикета src_ti с учетом спреда
*/

double src_tp = 0;
int src_ty = -1;
int addSPREAD = 0;
int SPREAD = MarketInfo(Symbol(), MODE_SPREAD);

if(!OrderSelect(src_ti, SELECT_BY_TICKET)) return(false);

src_tp = OrderTakeProfit();
src_ty = OrderType();

if(src_ty == OP_BUY || src_ty == OP_BUYSTOP || src_ty == OP_BUYLIMIT){
addSPREAD = SPREAD;
}else{
addSPREAD = -1*SPREAD;
}

return(TR_ModifySL(dest_ti, (src_tp+addSPREAD*Point), TR_MODE_PRICE));
}

[/code]
МедальКубок
Сообщений: 536
Назад

TR_MoveOrder


Передвигает отложенный ордер на заданную цену или на заданное кол. пунктов от цены открытия ордера.

[code=php]
bool TR_MoveOrder(int src_ti, double pr, int mode = 1){
/**
\version 0.0.3
\date 2013.04.25
\author Morochin Artiom
\details Передвигает отложенный ордер на заданную цену или на заданное кол. пунктов
от цены открытия ордера.
\warning В определении дельты тп и сл используется плюсование единицы!!!!
\internal
>Hist:
@0.0.3@2013.04.25@artamir [] Изменил расчет новой цены тп и сл
@0.0.2@2013.04.25@artamir [] Добавил проверку на тип ордера, который нужно двигать
@0.0.1@2013.04.25@artamir [] TR_MoveOrder
*/

double src_pr, src_tp, src_sl;
double new_pr, new_tp, new_sl;

int src_ty;
double src_delta_tp, src_delta_sl;

int delta_pips;

if(!OrderSelect(src_ti, SELECT_BY_TICKET) ) return(false);

src_pr = OrderOpenPrice();
src_tp = OrderTakeProfit();
src_sl = OrderStopLoss();
src_ty = OrderType();

src_delta_sl = MathAbs((Norm_symb(src_pr,"",2) - Norm_symb(src_sl,"",2)) / Point);
src_delta_tp = MathAbs((Norm_symb(src_pr,"",2) - Norm_symb(src_tp,"",2)) / Point);

if(mode == TR_MODE_PRICE){
delta_pips = MathAbs(pr - src_pr);

//--------------------------------------------------
new_pr = Norm_symb(pr);
}

if(mode == TR_MODE_PIP){
delta_pips = pr;

//--------------------------------------------------
new_pr = src_pr + delta_pips*Point;
new_pr = Norm_symb(new_pr);
}

if(src_tp > 0){
if(src_ty == OP_BUYSTOP || src_ty == OP_BUYLIMIT){
new_tp = new_pr + src_delta_tp*Point;
}

if(src_ty == OP_SELLSTOP || src_ty == OP_SELLLIMIT){
new_tp = new_pr - src_delta_tp*Point;
}
}else{
new_tp = -1;
}

if(src_sl > 0){
if(src_ty == OP_BUYSTOP || src_ty == OP_BUYLIMIT){
new_sl = new_pr - src_delta_sl*Point;
}

if(src_ty == OP_SELLSTOP || src_ty == OP_SELLLIMIT){
new_sl = new_pr + src_delta_sl*Point;
}
}else{
new_sl = -1;
}

new_tp = Norm_symb(new_tp);
new_sl = Norm_symb(new_sl);

//------------------------------------------------------
return(_OrderModify(src_ti, new_pr, new_sl, new_tp, -1));
}

[/code]
МедальКубок
Сообщений: 536
Назад

TR_MoveToOrder


Двигает ордер-получатель к ордеру-источнику с учетом спреда.

[code=php]
bool TR_MoveToOrder( int dest_ti /** тикет-получатель */
, int src_ti /** тикет-источник*/){
/**
\version 0.0.0.1
\date 2013.06.27
\author Morochin Artiom
\details Двигает ордер-получатель к ордеру-источнику с учетом спреда.
\internal
>Hist:
@0.0.0.1@2013.06.27@artamir [] TR_MoveToOrder
>Rev:0
*/

if(!OrderSelect(src_ti, SELECT_BY_TICKET)){return(false);}
int src_ty = OrderType();
double src_op = OrderOpenPrice();

if(!OrderSelect(dest_ti, SELECT_BY_TICKET)){return(false);}
int dest_ty = OrderType();
double dest_op = OrderOpenPrice();

int SPREAD = MarketInfo(Symbol(), MODE_SPREAD);
int addSpread = 0;

if(src_ty == OP_BUY || src_ty == OP_BUYSTOP || src_ty == OP_BUYLIMIT){
if(dest_ty == OP_SELLSTOP || dest_ty == OP_SELLLIMIT){
addSpread = -1*SPREAD;
}
}

if(src_ty == OP_SELL || src_ty == OP_SELLSTOP || src_ty == OP_SELLLIMIT){
if(dest_ty == OP_BUYSTOP || dest_ty == OP_BUYLIMIT){
addSpread = SPREAD;
}
}

return(TR_MoveOrder(dest_ti, (src_op+addSpread*Point)));
}

[/code]
МедальКубок
Сообщений: 536
Назад

TR_ModifySLByPrice


Расчитывается стоплосс ордера от цены закрытия ордера. Удобно использовать в трейлингах.

[code=php]
bool TR_ModifySLByPrice(int ti, int minus_pip = 0){
/**
\version 0.0.0.2
\date 2013.05.17
\author Morochin Artiom
\details Расчитывается стоплосс ордера от цены закрытия ордера.
\internal
>Hist:
@0.0.0.2@2013.05.17@artamir [] TR_ModifySLByPrice
@0.0.0.1@2013.05.15@artamir [] TR_ModifySLByPrice
>Rev:0
*/

if(! OrderSelect(ti, SELECT_BY_TICKET)) return(false);

int ty = OrderType();

double new_sl = 0.00;

if(ty == OP_BUY || ty == OP_BUYSTOP || ty == OP_BUYLIMIT){
new_sl = Norm_symb(OrderClosePrice() - minus_pip*Point);
}

if(ty == OP_SELL || ty == OP_SELLSTOP || ty == OP_SELLLIMIT){
new_sl = Norm_symb(OrderClosePrice() + minus_pip*Point);
}

return(TR_ModifySL(ti, new_sl));
}
[/code]
МедальКубок
Сообщений: 536

SelectedSymbols



Разбирает файл, содержащий валютные пары из "обзор рынка"
[code=php]
void SelectedSymbols(){
/**
\version 0.0.0.0
\date 2013.08.27
\author Morochin Artiom
\details Detailed description
\internal
>Hist:
>Rev:0
*/

int h = FileOpenHistory("symbols.sel",FILE_BIN|FILE_READ); //открываем файл обзора рынка.
int symbols_count = (FileSize(h)-2)/130+1; //всего выбрано валютных пар.

int start_ofset = 4;// первые 4 байта пропускаем.

string s = "";

for(int i = 0; i int total_ofset = start_ofset+128*i; //расчет офсета с начала файла.
FileSeek(h,total_ofset,SEEK_SET); //переводим курсор на расчитанный офсет.
s = FileReadString(h,10); //читаем 10 байт (содержат название валютной пары)
Print(i+": "+s); //делаем с названием что хотим.
}
FileClose(h); //закрываем файл.
}
[/code]
Редактировалось: 1 раз (Последний: 27 августа 2013 в 17:04)
МедальКубок
Сообщений: 536
По заверениям разработчиков, нас ожидает обновление языка MQL4 а так же торговой платформы. Тестовую версию IDE и компилятора можно найти по ссылке. По этому публикацию новых процедур и функций я приостанавливаю до выяснения обстоятельств и совместимости с новой платформой. Возможно выложенные в этой ветке процедуры/функции претерпят изменений.
Поживем увидим.
МедальКубок
Сообщений: 536
Назад

TR_CloseByTicket


Закрытие ордера по тикету. Если ордер рыночный, то происходит закрытие по рынку, если отложенный, то удаление.

[code=php]
bool TR_CloseByTicket(int ticket){
/*
>Ver : 0.0.7
>Date : 2013.02.24
>Hist:
@0.0.6@2012.10.04@artamir []
@0.0.5@2012.10.01@artamir []
@0.0.4@2012.10.01@artamir [+] add checking on err 138
@0.0.3@2012.10.01@artamir [+] add setExtraIsClosedByTicket
@0.0.2@2012.10.01@artamir []
@0.0.1@2012.09.14@artamir []
>Desc:
Закрытие ордера по тикету.
Если ордер рыночный, то происходит закрытие по рынку,
если отложенный, то удаление.
*/

//------------------------------------------------------
if(!OrderSelect(ticket, SELECT_BY_TICKET)) return(false);

//------------------------------------------------------
if(OrderType() != OP_BUY && OrderType() != OP_SELL){
return(OrderDelete(ticket));
}

//------------------------------------------------------
double price = 0.00;//MI_MarketCloseByCMD(OrderType());

price = Norm_symb(price);
//------------------------------------------------------
double lot = OrderLots();

//------------------------------------------------------
int tryCount = 0;

//------------------------------------------------------
bool res = false;

//------------------------------------------------------
while(!res && tryCount < 5 && !IsTradeContextBusy()){

//----------------------------------------------
RefreshRates();

if(OrderType() == OP_BUY){
price = MarketInfo(OrderSymbol(), MODE_BID);
}else{
if(OrderType() == OP_SELL){
price = MarketInfo(OrderSymbol(), MODE_ASK);
}
}

//----------------------------------------------
//price = libMI_getMarketClosePriceByCMD(OrderType());

//----------------------------------------------
price = Norm_symb(price);

//--------------------------------------------------
res = OrderClose(ticket, lot, price, 0, CLR_NONE);

//--------------------------------------------------
int err = GetLastError();

//--------------------------------------------------
if(err == 138){

//----------------------------------------------
//Sleep(11000);
Print("X3");
}

//--------------------------------------------------
tryCount++;
}

//------------------------------------------------------
if(res){
OE_setCloseByTicket(ticket);
}

//------------------------------------------------------
return(res);
}

[/code]
МедальКубок
Сообщений: 536
Назад

TR_CloseAll


Закрывает все ордера. Возможна фильтрация по магику.

[code=php]
void TR_CloseAll(int mn=-1){
/**
\version 0.0.0.1
\date 2013.09.29
\author Morochin Artiom
\details Закрывает все ордера. Возможна фильтрация по магику
\internal
>Hist:
@0.0.0.1@2013.09.29@artamir [] TR_CloseAll
>Rev:0
*/

int t=OrdersTotal();
for(int i=t;i>=0;i--){
if(!OrderSelect(i,SELECT_BY_POS, MODE_TRADES)){continue;}
if(mn>0){
if(OrderMagicNumber() != mn){continue;}
}

TR_CloseByTicket(OrderTicket());
}
}

[/code]
МедальКубок
Сообщений: 536
Назад

TR_SendPendingLikeOrder


Выставление похожего ордера в зависимости от цены. Если ордер-источник=бай и цена ниже цены ордера, то выставляется байстоп. Если ордер-источник=бай и цена выше цены ордера, то выставляется байлимит.

[code=php]
int TR_SendPendingLikeOrder(double &d[], int src_ti=0, int AddPips=0){
/**
\version 0.0.0.3
\date 2013.09.18
\author Morochin Artiom
\details Выставление похожего ордера в зависимости от цены.
Если ордер-источник=бай и цена ниже цены ордера, то выставляется байстоп.
Если ордер-источник=бай и цена выше цены ордера, то выставляется байлимит.
\internal
>Hist:
@0.0.0.3@2013.09.18@artamir [*] Изменения в связи с возможностью выставлять сл и тп в виде ценового уровня.
@0.0.0.2@2013.09.17@artamir [*] Исправление, не вытавлялся тп и сл
@0.0.0.1@2013.09.16@artamir [+] TR_SendPendingLikeOrder
>Rev:0
*/

if(!OrderSelect(src_ti, SELECT_BY_TICKET)){return(-1);}

int src_ty=OrderType();
double src_op=OrderOpenPrice();
double src_sl=OrderStopLoss();
double src_tp=OrderTakeProfit();
double src_lot=OrderLots();
double src_mn=OrderMagicNumber();
string src_sy=OrderSymbol();
string src_comm=OrderComment();

double _BID = MarketInfo(src_sy, MODE_BID);
double _ASK = MarketInfo(src_sy, MODE_ASK);

int ty = -1;
double sl_pip=0;
double tp_pip=0;
if(src_sl>0){sl_pip=src_sl;}//=MathAbs((src_op-src_sl)/Point);}
if(src_tp>0){tp_pip=src_tp;}//=MathAbs((src_op-src_tp)/Point);}

if(src_ty==OP_BUY ){
if(_ASK if(_BID>src_op){ty=OP_BUYLIMIT;}
}

if(src_ty==OP_SELL){
if(_BID>src_op){ty=OP_SELLSTOP;}
if(_ASK }

return(TR_SendPending_array(d,ty,src_op,AddPips,src_lot,tp_pip,sl_pip,src_comm, src_mn, src_sy, TR_MODE_PRICE));
}

[/code]
МедальКубок
Сообщений: 536
sysTrades.mqh

Примеры использования библиотеки



[code=php]int ti=TR_SendBUYSTOP(0);[/code]
Выставит байстоп ордер объемом = максимум между 0.01 и минимально разрешенным объемом брокером. По текущей цене аск + уровень STOPLEVEL. Т.е. на минимально возможном расстоянии от цены.

Если хотим выставить ордер селлстоп по заранее известной цене, то это будет выглядеть так
[code=php]
double pr=1.3578;
int ti=TR_SendSELLSTOP(pr);
[/code]

Чтоб выставить байлимит на расстоянии 20 пунктов ниже цены 1.3578 то
[code=php]
double pr=1.3578;
int ti=TR_SendBUYLIMIT(pr,20);
[/code]
Редактировалось: 1 раз (Последний: 1 октября 2013 в 17:01)
В начало страницы 
|
Перейти на форум:
Страницы: Первая Предыдущая 2 3 4 5 6
Быстрый ответ
Чтобы писать на форуме, зарегистрируйтесь или авторизуйтесь.

← Назад