На этом сайте, в разделе «файловый архив», выложен неприметный советник «Lok V4», суть работы его проста:
выставляются две отложки в противополжных направлениях, при срабатывании одного из ордеров к противоположному дополнительно добавляется оложенный ордер величины IncLot(так названо в параметрах),
эту процедуру)) данный советник делает одноразово, поэтому, при «неверном» движении цены либо слив, либо долгое ожидание возвращения цены.У меня просьба «подкрутить» в программе, что бы эту процедуру (по увеличению локирующего ордера) советник делал многократно, до срабатывания одного из ордеров по тп или если не сложно, чтобы данное количество циклов добавленя доп. ордеров было настраиваемым, так же не откажусь от советов, замечаний и тд по доработке.., сам то я нуб) на этом форексе.
дополнительно прилагаю схему желаемой доработки и на всякий случай всю программу самого советника Lok v4.
на схеме цыфрами показан общий лот на каждом из участков в зависимости от движения цены, кстати, если «прикрутить» трал, то получится почти небезъизвестный платный советник ParaStop v8.1
ps — да, забыл, при закрытии ордера по тп и выставлении новой пары, оставшаяся отложка удаляется.
extern string s0 = "========== Position entry ========== ";
extern int Step = 10;
extern int MaxOrders = 1000;
extern double FirstLot = 0.01;
extern double IncLot = 0.01;
extern int Digit = 5;
extern string s1 = "========== Trading Window ========== ";
extern string PlaceTradesFrom = «00:00»;
extern string PlaceTradesTo = «23:59»;
extern string s2 = "============ Profit Taking ============ ";
extern double MinProfit = 5.0;
extern int DailyProfitTarget = 0;
extern string s3 = "============ Stop Loss ============ ";
extern string MaxLoss = «0=none; 1=pips (position with largest loss); 2=percent (all orders)»;
extern int MaxLossMethod = 1;
extern int MaxLossPips = 100;
extern int MaxLossPct = 5;
extern string s4 = "============ EA Settings ============ ";
extern int MaxRetry = 3;
extern int Slippage = 3;
extern int Magic = 2008;
double sellLots = 0.0;
double buyLots = 0.0;
double lastSellPrice;
double lastBuyPrice;
int LastOrder;
double pt;
int init()
{
pt = Point;
if (Digits == 3 || Digits == Digit) {
Slippage *= 10;
pt = 10*pt;
}
return(0);
}
int start() {
string txt;
int totalOrders = MyOrdersTotal(Magic);
if (GetTotalProfit(Magic) >= MinProfit) {
Print(«Profit target reached»);
DeletePendingOrders(Magic);
CloseOrders(Magic);
}
if (MaxLossMethod == 1 && GetMaxLossPips(Magic) >= MaxLossPips)
{
Print(«Maximum loss (pips) reached»);
DeletePendingOrders(Magic);
CloseOrders(Magic);
}
else if (MaxLossMethod == 2 && GetTotalProfit(Magic) <= -1*AccountBalance()*MaxLossPct/100)
{
Print(«Maximum loss reached»);
DeletePendingOrders(Magic);
CloseOrders(Magic);
}
GlobalVariableSet(«OldBalance», AccountBalance());
if (!IsInTimeWindow(PlaceTradesFrom, PlaceTradesTo))
{
if (totalOrders > 0) {
DeletePendingOrders(Magic);
}
txt = «Not in trading window»;
}
else
{
txt = «In trading window\nDaily profit: » + DoubleToStr(GetDailyProfit(Magic), 2);
if (totalOrders == 0 && (DailyProfitTarget == 0 || DailyProfitTarget > GetDailyProfit(Magic))) {
int res=OrderSend(Symbol(), OP_SELLSTOP, FirstLot, Bid — Step * pt, 3, 0, 0, "", Magic, 0, Red);
res=OrderSend(Symbol(), OP_BUYSTOP, FirstLot, Ask + Step * pt, 3, 0, 0, "", Magic, 0, Green);
}
else
{if (totalOrders==2 && (DailyProfitTarget <= GetDailyProfit(Magic))) {txt = txt + "\nDaily target reached.";
lastSellPrice = GetLastSellPrice(Magic);
LastOrder = GetLastOrder(Magic);
lastBuyPrice = GetLastBuyPrice(Magic);
switch(LastOrder)
{
case OP_BUY: res=OrderSend(Symbol(), OP_SELLSTOP, buyLots + IncLot, lastSellPrice, 3, 0, 0, "", Magic, 0, Green); break;
case OP_SELL: res=OrderSend(Symbol(), OP_BUYSTOP, sellLots + IncLot, lastBuyPrice, 3, 0, 0, "", Magic, 0, Red); break;
}
}}
}
Comment(txt);
return (0);
}
int DeletePendingOrders(int magic) {
int total;
total = OrdersTotal();
for (int i = total-1; i >= 0; i--) {
bool sel=OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() == magic && OrderSymbol() == Symbol() && (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP))
{
Print(«closing pending order », i, ", ticket #", OrderTicket());
bool del=OrderDelete(OrderTicket());
}
}
return (0);
}
int CloseOrders(int magic) {
int total;
double price;
total = OrdersTotal();
for (int i = total-1; i >= 0; i--) {
bool sel=OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() == magic && OrderSymbol() == Symbol()) {
RefreshRates();
Print(«closing trade », i, ", ticket #", OrderTicket());
if (OrderType() == OP_BUY) price = Bid; else price = Ask;
for (int k=1; k <= MaxRetry; k++)
{
Print(«closing order », i, ", ticket #", OrderTicket());
if (OrderClose(OrderTicket(), OrderLots(), price, Slippage)) break;
Print(«Error closing trade: », GetLastError());
}
}
}
return (0);
}
int MyOrdersTotal(int magic) {
int count;
int total;
count = 0;
total = OrdersTotal();
for (int i = 0; i < total; i++) {
bool sel=OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() == magic && OrderSymbol() == Symbol()) count++;
}
return (count);
}
double GetLastSellPrice(int magic) {
int total;
total = OrdersTotal() — 1;
for (int i = total; i >= 0; i--) {
bool sel=OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() == magic && OrderSymbol() == Symbol() && (OrderType() == OP_SELL || OrderType() == OP_SELLSTOP )) {
sellLots = OrderLots();
return (OrderOpenPrice());
}
}
return (0);
}
double GetLastBuyPrice(int magic) {
int total;
total = OrdersTotal() — 1;
for (int i = total; i >= 0; i--) {
bool sel=OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() == magic && OrderSymbol() == Symbol() && (OrderType() == OP_BUYSTOP || OrderType() == OP_BUY )) {
buyLots = OrderLots();
return (OrderOpenPrice());
}
}
return (0);
}
double GetLastOrder(int magic) {
int total;
total = OrdersTotal() — 1;
for (int i = 0; i <OrdersTotal(); i++) {
bool sel=OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() == magic && OrderSymbol() == Symbol() &&( OrderType() == OP_SELL || OrderType() == OP_BUY )) {
LastOrder = OrderType();
return (OrderType());
}
}
return (100000);
}
int GetMaxLossPips(int magic) {
int i, pips;
int maxLoss = 0;
i = OrdersTotal() — 1;
for (int k = i; k >= 0; k--) {
bool sel=OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() == magic && OrderSymbol() == Symbol() && (OrderType() == OP_BUY || OrderType() == OP_SELL)) {
if (OrderType() == OP_BUY) pips = Ask-OrderOpenPrice(); else pips = OrderOpenPrice()-Bid;
pips = pips/pt;
if (pips < 0 && MathAbs(pips) > maxLoss) maxLoss = MathAbs(pips);
}
}
return (maxLoss);
}
double GetTotalProfit(int magic) {
int i;
double total = 0;
i = OrdersTotal() — 1;
for (int k = i; k >= 0; k--) {
bool sel=OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() == magic && OrderSymbol() == Symbol() && (OrderType() == OP_BUY || OrderType() == OP_SELL)) {
total += OrderProfit();
}
}
return (total);
}
double GetDailyProfit(int magic) {
int i;
double total = 0;
i = OrdersHistoryTotal() — 1;
for (int k = i; k >= 0; k--) {
bool sel=OrderSelect(k, SELECT_BY_POS, MODE_HISTORY);
if (OrderMagicNumber() == magic && OrderSymbol() == Symbol() && (OrderType() == OP_BUY || OrderType() == OP_SELL)) {
int dt1 = TimeYear(TimeCurrent())*10000+TimeMonth(TimeCurrent())*100+TimeDay(TimeCurrent());
int dt2 = TimeYear(OrderOpenTime())*10000+TimeMonth(OrderOpenTime())*100+TimeDay(OrderOpenTime());
// Print(dt1, " ", dt2);
if (dt1 == dt2 )
total += OrderProfit();
}
}
return (total);
}
bool IsInTimeWindow(string t1, string t2)
{
string tc = TimeToStr(TimeCurrent(), TIME_MINUTES);
if (t2 > t1)
return (tc >= t1 && tc <= t2);
else
return (tc >= t1 || tc <= t2);
}
Комментарии (3)
opentraders.ru/downloads/577/
opentraders.ru/downloads/581/
opentraders.ru/downloads/617/
И сейчас наиболее обсуждаемый в топике:
opentraders.ru/downloads/648/
27 Oxy Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..
зы-пост можете удалить за ненадобностью,… хотел сам, но куда то делась кнопка «удалить\редактировать»(??)
2 russwill Автор Сообщений: 63
27 Oxy Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий