Ben's Stochastic EMA Auto Trading Robot
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «ben's stochastic ema auto trading robot.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Ben's Stochastic EMA Auto Trading Robot — торговый советник для MetaTrader 4, использующий стохастический индикатор и средние скользящие AllAverages для определения тренда и поиска торговых возможностей. Советник открывает сделки на покупку или продажу при пересечении стохастиком уровней перекупленности/перепроданности в направлении тренда. Включает множество фильтров: проверку спреда, торговых часов, маржинальных требований и баланса валютных пар.
Советник поддерживает различные типы управления позициями: фиксацию безубыточности (Break Even), скользящий стоп-лосс (Trailing Stop), прыжущий стоп-лосс (Jumping Stop) и стоп-лосс по свечам (Candlestick Trailing Stop). Также реализована скрытая система стоп-лосса и тейк-профита с отображением линий на графике.
Основные параметры настраивают размер лота, уровни стоп-лосса и тейк-профита, магический номер, параметры стохастика и средних скользящих. Доступны дополнительные фильтры: ограничение по свопу для определённых валютных пар, проверка торгового времени и ограничение на одновременную торговлю одной валютной пары не более двух раз.
Настройки программы
| Настройка | Описание |
|---|---|
| gen | Заголовок группы общих настроек. |
| Lot | Размер лота для каждой сделки. |
| StopTrading | Переключатель, полностью запрещающий советнику открывать новые сделки. |
| TradeLong | Разрешает открытие длинных позиций (покупка). |
| TradeShort | Разрешает открытие коротких позиций (продажа). |
| TakeProfit | Уровень тейк-профита в пунктах. |
| StopLoss | Уровень стоп-лосса в пунктах. |
| MagicNumber | Магический номер для идентификации ордеров, управляемых советником. |
| TradeComment | Комментарий, добавляемый к каждой сделке. |
| CriminalIsECN | Переключатель режима ECN для корректной отправки ордеров через модификацию. |
| MaxSpread | Максимально допустимый спред в пунктах для разрешения торговли. |
| sto | Заголовок группы настроек стохастика. |
| StochOverSold | Уровень перепроданности стохастического индикатора (по умолчанию 20). |
| StochOverBought | Уровень перекупленности стохастического индикатора (по умолчанию 80). |
| StochCloseBuffer | Буфер закрытия стохастика (параметр, объявленный в настройках). |
| K | Период K (быстрая линия) стохастического индикатора. |
| D | Период D (медленная линия) стохастического индикатора. |
| Slowing | Замедление (сглаживание) стохастического индикатора. |
| PriceField | Поле цены для стохастического индикатора (0=Low/High, 1=Close/Close). |
| mam | Заголовок группы настроек метода скользящей средней. |
| MaMethod | Метод расчёта стохастического индикатора (тип скользящей для сигнальной линии). |
| Mode | Режим стохастика (0=Main, 1=Signal) — определяет, какой буфер используется для чтения. |
| aal | Заголовок группы настроек всех средних скользящих. |
| UseAA | Включает или отключает использование индикатора AllAverages для определения тренда. |
| TimeFrame | Таймфрейм для расчёта средних скользящих AllAverages (0=текущий). |
| Price | Тип цены для расчёта средних скользящих AllAverages (0=Low/High, 1=Close/Close). |
| MA_Period | Период расчёта скользящей средней AllAverages. |
| MA_Shift | Сдвиг скользящей средней AllAverages. |
| MA_Method | Метод расчёта скользящей средней (0=Simple, 1=Exponential, 3=Smoothed, 4=Linear). |
| CandleShift | Сдвиг свечи для чтения значений средних скользящих AllAverages. |
| hts | Заголовок группы настроек скрытого стоп-лосса и тейк-профита. |
| HiddenPips | Скрытые пункты, добавляемые к стоп-лоссу и тейк-профиту для расчёта скрытых линий закрытия. |
| bf | Заголовок группы настроек торговых фильтров баланса. |
| UseZeljko | Включает фильтр сбалансированной торговли (Balanced Pair) от Zeljko. |
| OnlyTradeCurrencyTwice | Включает ограничение: каждая валюта может быть задействована максимум в двух открытых позициях. |
| amc | Заголовок группы настроек проверки доступной маржи. |
| sco | Заголовок фильтра Scoobs. |
| UseScoobsMarginCheck | Включает проверку маржи по методу Scoobs (запрет торговли при недостатке маржи). |
| fk | Заголовок фильтра ForexKiwi. |
| UseForexKiwi | Включает фильтр минимального процента маржи ForexKiwi. |
| FkMinimumMarginPercent | Минимальный процент маржи для фильтра ForexKiwi (торговля разрешена, если маржа выше этого значения). |
| tt | Заголовок группы настроек торговых часов. |
| Trade_Hours | Заголовок группы настроек торговых часов. |
| Trade_Hoursi | Заголовок режима 24-часового торгового таймера. |
| Trade_Hours_M | Заголовок утренних торговых часов. |
| start_hourm | Начальный час утренних торговых сессий (24-часовой формат). |
| end_hourm | Конечный час утренних торговых сессий (24-часовой формат). |
| Trade_Hours_E | Заголовок вечерних торговых часов. |
| start_houre | Начальный час вечерних торговых сессий (24-часовой формат). |
| end_houre | Конечный час вечерних торговых сессий (24-часовой формат). |
| spt | Заголовок группы настроек конкретного времени. |
| StartTime | Конкретное время для запуска торговли (параметр специфического таймера). |
| pts | Заголовок группы настроек фильтра свопа. |
| CadPairsPositiveOnly | Разрешает торговать парами с CAD только при положительном свопе (только для фильтра свопа). |
| AudPairsPositiveOnly | Разрешает торговать парами с AUD только при положительном свопе (только для фильтра свопа). |
| NzdPairsPositiveOnly | Разрешает торговать парами с NZD только при положительном свопе (только для фильтра свопа). |
| tmm | Заголовок группы настроек управления торговлей. |
| BE | Заголовок группы настроек безубыточности. |
| BreakEven | Включает или отключает функцию фиксации безубыточности (перемещение стоп-лосса на уровень открытия позиции). |
| BreakEvenPips | Количество пунктов, на которых активируется фиксация безубыточности. |
| BreakEvenProfit | Количество пунктов прибыли, на которых фиксируется безубыточность после активации. |
| cts | Заголовок группы настроек свечного скользящего стоп-лосса. |
| UseCandlestickTrailingStop | Включает стоп-лосс, привязанный к экстремумам предыдущей свечи. |
| JSL | Заголовок группы настроек прыжущего стоп-лосса. |
| JumpingStop | Включает или отключает прыжущий стоп-лосс (поэтапное перемещение стопа при достижении прибыли). |
| JumpingStopPips | Количество пунктов, на которые перемещается стоп-лосс при каждом срабатывании прыжущего стопа. |
| TSL | Заголовок группы настроек скользящего стоп-лосса. |
| TrailingStop | Включает или отключает скользящий стоп-лосс (Trailing Stop). |
| TrailingStopPips | Количество пунктов для отступа скользящего стоп-лосса от текущей цены. |
| mis | Заголовок группы прочих настроек. |
| ShowManagementAlerts | Включает или отключает отображение информационных сообщений на графике. |
| DisplayGapSize | Количество пробелов в информационном выводе на графике. |
Поиск по коду файла
#include <WinUser32.mqh>
#include <stdlib.mqh>
#define NL "\n"
#define up "Up"
#define down "Down"
#define none "None"
#define both "Both"
#define TpPrefix "Tp"
#define SlPrefix "Sl"
/*
Matt Kennel has provided the code for bool O_R_CheckForHistory(int ticket). Cheers Matt, You are a star.
Code for adding debugging Sleep
Alert("G");
int x = 0;
while (x == 0) Sleep(100);
Code for returning a value as pips. The example returns the range of the previous candle
int PipDivisor = 1;
if (Digits == 3 || Digits == 5) PipDivisor = 10;
double CandleRange = ((High[1] - Low[1]) / Point) / PipDivisor;
Standard order loop code
for (int cc = OrdersTotal() - 1; cc >= 0; cc--)
{
if (!OrderSelect(cc, SELECT_BY_POS) ) continue;
if (OrderSymbol() != Symbol() ) continue;
if (OrderMagicNumber() != MagicNumber) continue;
}//for (int cc = OrdersTotal() - 1; cc >= 0; cc--)
FUNCTIONS LIST
int init()
int start()
----Trading----
void LookForTradingOpportunities()
bool IsTradingAllowed()
bool SendSingleTrade(int type, string comment, double lotsize, double price, double stop, double take)
void ModifyOrder(int ticket, double stop, double take)
bool DoesTradeExist()
void CountOpenTrades()
bool CloseTrade(int ticket)
void LookForTradeClosure()
bool CheckTradingTimes()
void CloseAllTrades()
----Hidden sl/tp---- Doubles up for pending trades-based ea's
void DrawPendingPriceLines()
void DeletePendingPriceLines()
void ReplaceMissingSlTpLines()
----Balance/swap filters module----
void TradeDirectionBySwap()
bool IsThisPairTradable()
bool BalancedPair(int type)
----Matt's Order Reliable library code
bool O_R_CheckForHistory(int ticket) Cheers Matt, You are a star.
void O_R_Sleep(double mean_time, double max_time)
----Indicator readings----
void ReadIndicatorValues()
double GetAa(int tf, int price, int period, int mashift, int method, int buffer, int shift)
double GetStochastic(int shift)
----Trade management module----
void TradeManagementModule()
void BreakEvenStopLoss()
void JumpingStopLoss()
void HiddenTakeProfit()
void HiddenStopLoss()
void TrailingStopLoss()
*/
extern string gen="----General inputs----";
extern double Lot=0.01;
extern bool StopTrading=false;
extern bool TradeLong=true;
extern bool TradeShort=true;
extern int TakeProfit=20;
extern int StopLoss=40;
extern int MagicNumber=0;
extern string TradeComment="";
extern bool CriminalIsECN=false;
extern double MaxSpread=120;
extern string sto="----Stochastic----";
extern int StochOverSold=20;
extern int StochOverBought=80;
extern int StochCloseBuffer=5;
extern int K = 14;
extern int D = 5;
extern int Slowing=2;
extern string pf="0=Low/High; 1=Close/Close";
extern int PriceField=0;
extern string mam="0=Simple: 1=Exp: 3=Smooth{ 4=Linear";
extern int MaMethod=0;
extern string mode="0=Main; 1=Signal";
extern int Mode=0;
extern string aal="----All averages inputs----";
extern bool UseAA=true;
extern int TimeFrame = 0;
extern int Price = 0;
extern int MA_Period = 50;
extern int MA_Shift = 0;
extern int MA_Method = 1;
extern int CandleShift = 0;
extern string hts="----Stealth stop loss and take profit inputs----";
extern int HiddenPips=0;//Added to the 'hard' sl and tp and used for closure calculations
extern string bf="----Trading balance filters----";
extern bool UseZeljko=true;
extern bool OnlyTradeCurrencyTwice=true;
extern string amc="----Available Margin checks----";
extern string sco="Scoobs";
extern bool UseScoobsMarginCheck=false;
extern string fk="ForexKiwi";
extern bool UseForexKiwi=true;
extern int FkMinimumMarginPercent=1500;
extern string tt="----Trading hours----";
extern string Trade_Hours= "Set Morning & Evening Hours";
extern string Trade_Hoursi= "Use 24 hour, local time clock";
extern string Trade_Hours_M= "Morning Hours 0-12";
extern int start_hourm = 0;
extern int end_hourm = 12;
extern string Trade_Hours_E= "Evening Hours 12-24";
extern int start_houre = 12;
extern int end_houre = 24;
extern string spt="----Specific time inputs----";
extern double StartTime=12.15;
extern string pts="----Swap filter----";
extern bool CadPairsPositiveOnly=true;
extern bool AudPairsPositiveOnly=true;
extern bool NzdPairsPositiveOnly=true;
extern string tmm="----Trade management module----";
extern string BE="Break even settings";
extern bool BreakEven=false;
extern int BreakEvenPips=10;
extern int BreakEvenProfit=5;
extern string cts="----Candlestick trailing stop----";
extern bool UseCandlestickTrailingStop=false;
extern string JSL="Jumping stop loss settings";
extern bool JumpingStop=false;
extern int JumpingStopPips=10;
extern string TSL="Trailing stop loss settings";
extern bool TrailingStop=false;
extern int TrailingStopPips=20;
extern string mis="----Odds and ends----";
extern bool ShowManagementAlerts=true;
extern int DisplayGapSize=30;
int O_R_Setting_max_retries = 10;
double O_R_Setting_sleep_time = 4.0; /* seconds */
double O_R_Setting_sleep_max = 15.0; /* seconds */
int TicketNo, OpenTrades;
bool CanTradeThisPair;//Will be false when this pair fails the currency can only trade twice filter, or the balanced trade filter
bool BuyOpen, SellOpen;
int RetryCount = 10;//Will make this number of attempts to get around the trade context busy error.
double AaVal, AaUp, AaDown;//Buffers 0 (val) 1 (up) and 3 (down)
string trend;
double StochVal, PrevStochVal;
bool PendingBuy, PendingSell;
double PendingPrice, PendingStop, PendingTake;
datetime PendingTime;
double PendingCandleRange;
double PendingRecreationCancelPips = 2;
double HiddenStopLoss, HiddenTakeProfit;
bool EnoughMargin;
string MarginMessage;
string Gap, ScreenMessage;
int OldBars;
int OldCstBars;//For candlestick ts
string PipDescription=" pips";
bool ForceTradeClosure;
void DisplayUserFeedback()
{
if (IsTesting() && !IsVisualMode()) return;
ScreenMessage = "";
ScreenMessage = StringConcatenate(ScreenMessage,Gap, NL);
ScreenMessage = StringConcatenate(ScreenMessage, Gap, TimeToStr(TimeLocal(), TIME_DATE|TIME_MINUTES|TIME_SECONDS), NL );
/*
double i;
int m,s,k;
m=Time[0]+Period()*60-CurTime();
i=m/60.0;
s=m%60;
m=(m-m%60)/60;
ScreenMessage = StringConcatenate(ScreenMessage,Gap, m + " minutes " + s + " seconds left to bar end", NL);
*/
ScreenMessage = StringConcatenate(ScreenMessage,Gap, NL);
ScreenMessage = StringConcatenate(ScreenMessage,Gap, "Lot size: ", Lot, " (Criminal's minimum lot size: ", MarketInfo(Symbol(), MODE_MINLOT), ")", NL);
ScreenMessage = StringConcatenate(ScreenMessage,Gap, "Take profit: ", TakeProfit, PipDescription, NL);
ScreenMessage = StringConcatenate(ScreenMessage,Gap, "Stop loss: ", StopLoss, PipDescription, NL);
ScreenMessage = StringConcatenate(ScreenMessage,Gap, "Magic number: ", MagicNumber, NL);
ScreenMessage = StringConcatenate(ScreenMessage,Gap, "Trade comment: ", TradeComment, NL);
if (CriminalIsECN) ScreenMessage = StringConcatenate(ScreenMessage,Gap, "CriminalIsECN = true", NL);
else ScreenMessage = StringConcatenate(ScreenMessage,Gap, "CriminalIsECN = false", NL);
ScreenMessage = StringConcatenate(ScreenMessage,Gap, "MaxSpread = ", MaxSpread, ": Spread = ", MarketInfo(Symbol(), MODE_SPREAD), NL, NL );
ScreenMessage = StringConcatenate(ScreenMessage,Gap, "Trading hours", NL);
if (start_hourm == 0 && end_hourm == 12 && start_houre && end_houre == 24) ScreenMessage = StringConcatenate(ScreenMessage,Gap, " 24H trading", NL);
else
{
ScreenMessage = StringConcatenate(ScreenMessage,Gap, " start_hourm: ", DoubleToStr(start_hourm, 2),
": end_hourm: ", DoubleToStr(end_hourm, 2), NL);
ScreenMessage = StringConcatenate(ScreenMessage,Gap, " start_houre: ", DoubleToStr(start_houre, 2),
": end_houre: ", DoubleToStr(end_houre, 2), NL);
}//else
ScreenMessage = StringConcatenate(ScreenMessage,Gap, NL);
ScreenMessage = StringConcatenate(ScreenMessage,Gap, "AA value ", AaVal, ": Trend is ", trend, NL);
ScreenMessage = StringConcatenate(ScreenMessage,Gap, "Current Stochastic: ", StochVal, NL);
ScreenMessage = StringConcatenate(ScreenMessage,Gap, "Previous Stochastic: ", PrevStochVal, NL);
ScreenMessage = StringConcatenate(ScreenMessage,Gap, NL);
if (BreakEven)
{
ScreenMessage = StringConcatenate(ScreenMessage,Gap, "Breakeven is set to ", BreakEvenPips, PipDescription);
ScreenMessage = StringConcatenate(ScreenMessage,": BreakEvenProfit = ", BreakEvenProfit, PipDescription);
ScreenMessage = StringConcatenate(ScreenMessage,Gap, NL);
}//if (BreakEven)
if (UseCandlestickTrailingStop)
{
ScreenMessage = StringConcatenate(ScreenMessage,Gap, "Using candlestick trailing stop", NL);
}//if (UseCandlestickTrailingStop)
if (JumpingStop)
{
ScreenMessage = StringConcatenate(ScreenMessage,Gap, "Jumping stop is set to ", JumpingStopPips, PipDescription);
ScreenMessage = StringConcatenate(ScreenMessage,Gap, NL);
}//if (JumpingStop)
if (TrailingStop)
{
ScreenMessage = StringConcatenate(ScreenMessage,Gap, "Trailing stop is set to ", TrailingStopPips, PipDescription);
ScreenMessage = StringConcatenate(ScreenMessage,Gap, NL);
}//if (TrailingStop)
if (MarginMessage != "") ScreenMessage = StringConcatenate(ScreenMessage,NL, Gap, MarginMessage, NL);
Comment(ScreenMessage);
}//void DisplayUserFeedback()
int init()
{
// код доступен только после оплаты
}
int deinit()
{
Comment("");
return(0);
}
void BreakEvenStopLoss() // Move stop loss to breakeven
{
double NewStop;
bool result;
string LineName = SlPrefix + DoubleToStr(OrderTicket(), 0);
double sl = ObjectGet(LineName, OBJPROP_PRICE1);
if (OrderType()==OP_BUY)
{
if (sl >= OrderOpenPrice() ) return;
if (Bid >= OrderOpenPrice () + (Point*BreakEvenPips))
{
NewStop = NormalizeDouble(OrderOpenPrice()+(BreakEvenProfit*Point), Digits);
if (ObjectFind(LineName) == -1)
{
ObjectCreate(LineName, OBJ_HLINE, 0, TimeCurrent(), 0);
ObjectSet(LineName, OBJPROP_COLOR, Red);
ObjectSet(LineName, OBJPROP_WIDTH, 1);
ObjectSet(LineName, OBJPROP_STYLE, STYLE_DOT);
}//if (ObjectFind(LineName == -1) )
ObjectMove(LineName, 0, TimeCurrent(), NewStop);
}//if (Bid >= OrderOpenPrice () + (Point*BreakEvenPips) &&
}//if (OrderType()==OP_BUY)
if (OrderType()==OP_SELL)
{
if (sl <= OrderOpenPrice() && sl > 0) return;
if (Ask <= OrderOpenPrice() - (Point*BreakEvenPips))
{
NewStop = NormalizeDouble(OrderOpenPrice()-(BreakEvenProfit*Point), Digits);
if (ObjectFind(LineName) == -1)
{
ObjectCreate(LineName, OBJ_HLINE, 0, TimeCurrent(), 0);
ObjectSet(LineName, OBJPROP_COLOR, Red);
ObjectSet(LineName, OBJPROP_WIDTH, 1);
ObjectSet(LineName, OBJPROP_STYLE, STYLE_DOT);
}//if (ObjectFind(LineName == -1) )
ObjectMove(LineName, 0, Time[0], NewStop);
}//if (Ask <= OrderOpenPrice() - (Point*BreakEvenPips) && (OrderStopLoss()>OrderOpenPrice()|| OrderStopLoss()==0))
}//if (OrderType()==OP_SELL)
} // End BreakevenStopLoss sub
void JumpingStopLoss()
{
if (OrderProfit() < 0) return;//Nothing to do
string LineName = SlPrefix + DoubleToStr(OrderTicket(), 0);
double sl = ObjectGet(LineName, OBJPROP_PRICE1);
if (sl == 0) return;//No line, so nothing to do
double NewStop;
if (OrderType()==OP_BUY)
{
if (sl < OrderOpenPrice() ) return;//Not at breakeven yet
if (Bid>= sl + ((JumpingStopPips*2)*Point) )
{
NewStop = NormalizeDouble(sl + (JumpingStopPips * Point), Digits);
ObjectMove(LineName, 0, Time[0], NewStop);
}// if (Bid>= sl + (JumpingStopPips*Point) && sl>= OrderOpenPrice())
}//if (OrderType()==OP_BUY)
if (OrderType()==OP_SELL)
{
if (sl > OrderOpenPrice() ) return;//Not at breakeven yet
if (Bid<= sl - ((JumpingStopPips*2)*Point))
{
NewStop = NormalizeDouble(sl - (JumpingStopPips * Point), Digits);
ObjectMove(LineName, 0, Time[0], NewStop);
}// close if (Bid>= sl + (JumpingStopPips*Point) && sl>= OrderOpenPrice())
}//if (OrderType()==OP_SELL)
} //End of JumpingStopLoss sub
void TrailingStopLoss()
{
if (OrderProfit() < 0) return;//Nothing to do
string LineName = SlPrefix + DoubleToStr(OrderTicket(), 0);
double sl = ObjectGet(LineName, OBJPROP_PRICE1);
if (sl == 0) return;//No line, so nothing to do
double NewStop;
if (OrderType()==OP_BUY)
{
if (sl < OrderOpenPrice() ) return;//Not at breakeven yet
if (Bid>= sl + (TrailingStopPips * Point) )
{
NewStop = NormalizeDouble(sl + (TrailingStopPips * Point), Digits);
ObjectMove(LineName, 0, Time[0], NewStop);
}// if (Bid>= sl + (JumpingStopPips*Point) && sl>= OrderOpenPrice())
}//if (OrderType()==OP_BUY)
if (OrderType()==OP_SELL)
{
if (sl > OrderOpenPrice() ) return;//Not at breakeven yet
if (Bid<= sl - (TrailingStopPips * Point) )
{
NewStop = NormalizeDouble(sl - (TrailingStopPips * Point), Digits);
ObjectMove(LineName, 0, Time[0], NewStop);
}// close if (Bid>= sl + (JumpingStopPips*Point) && sl>= OrderOpenPrice())
}//if (OrderType()==OP_SELL)
} // End of TrailingStopLoss sub
void CandlestickTrailingStop()
{
if (OldCstBars == Bars) return;
OldCstBars = Bars;
if (OrderProfit() < 0) return;//Nothing to do
string LineName = SlPrefix + DoubleToStr(OrderTicket(), 0);
double sl = ObjectGet(LineName, OBJPROP_PRICE1);
if (sl == 0) return;//No line, so nothing to do
double NewStop;
Alert("W");
if (OrderType() == OP_BUY)
{
if (Low[1] > sl)
{
NewStop = NormalizeDouble(Low[1], Digits);
ObjectMove(LineName, 0, Time[0], NewStop);
}//if (Low[1] > sl)
}//if (OrderType == OP_BUY)
if (OrderType() == OP_SELL)
{
if (High[1] < sl)
{
NewStop = NormalizeDouble(High[1], Digits);
ObjectMove(LineName, 0, Time[0], NewStop);
}//if (High[1] < sl)
}//if (OrderType() == OP_SELL)
}//End void CandlestickTrailingStop()
void TradeManagementModule()
{
if (UseCandlestickTrailingStop) CandlestickTrailingStop();
if(BreakEven) BreakEvenStopLoss();
if(JumpingStop) JumpingStopLoss();
if(TrailingStop) TrailingStopLoss();
}//void TradeManagementModule()
bool SendSingleTrade(int type, string comment, double lotsize, double price, double stop, double take)
{
int slippage = 10;
if (Digits == 3 || Digits == 5) slippage = 100;
color col = Red;
if (type == OP_BUY || type == OP_BUYSTOP) col = Green;
int expiry = 0;
for (int cc = 0; cc < RetryCount; cc++)
{
for (int d = 0; (d < RetryCount) && IsTradeContextBusy(); d++) Sleep(100);
RefreshRates();
if (type == OP_BUY) price = NormalizeDouble(Ask, Digits);
if (type == OP_SELL) price = NormalizeDouble(Bid, Digits);
if (!CriminalIsECN) int ticket = OrderSend(Symbol(),type, lotsize, price, slippage, stop, take, comment, MagicNumber, expiry, col);
if (CriminalIsECN)
{
ticket = OrderSend(Symbol(),type, lotsize, price, slippage, 0, 0, comment, MagicNumber, expiry, col);
if (ticket > -1)
{
ModifyOrder(ticket, stop, take);
}//if (ticket > 0)}
}//if (CriminalIsECN)
if (ticket > -1) break;//Exit the trade send loop
if (cc == RetryCount - 1) return(false);
}//for (int cc = 0; cc < RetryCount; cc++);
if (ticket < 0)
{
string stype;
if (type == OP_BUY) stype = "OP_BUY";
if (type == OP_SELL) stype = "OP_SELL";
if (type == OP_BUYLIMIT) stype = "OP_BUYLIMIT";
if (type == OP_SELLLIMIT) stype = "OP_SELLLIMIT";
if (type == OP_BUYSTOP) stype = "OP_BUYSTOP";
if (type == OP_SELLSTOP) stype = "OP_SELLSTOP";
int err=GetLastError();
Alert(Symbol(), " jor ", stype," order send failed with error(",err,"): ",ErrorDescription(err));
Print(Symbol(), " jor ", stype," order send failed with error(",err,"): ",ErrorDescription(err));
return(false);
}//if (ticket < 0)
TicketNo = ticket;
bool TradeReturnedFromCriminal = false;
while (!TradeReturnedFromCriminal)
{
TradeReturnedFromCriminal = O_R_CheckForHistory(ticket);
if (!TradeReturnedFromCriminal)
{
Alert(Symbol(), " sent trade not in your trade history yet. Turn of this ea NOW.");
}//if (!TradeReturnedFromCriminal)
}//while (!TradeReturnedFromCriminal)
return(true);
}//End bool SendSingleTrade(int type, string comment, double lotsize, double price, double stop, double take)
void ModifyOrder(int ticket, double stop, double take)
{
if (!OrderSelect(ticket, SELECT_BY_TICKET) ) return;//Trade does not exist, so no mod needed
for (int cc = 0; cc < RetryCount; cc++)
{
for (int d = 0; (d < RetryCount) Показано первые 50% кода (символов: 28467)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.