Първоначално изпратено от ptj_12345
ptj_12345
За мое нещастие и аз все още съм на това мнение , но като че ли все повече и повече започвом да се отчайвам по мъничко и да клоня към мненията на Роската и на Мечето, че Фореска е хаотичен и непредсказуем ,но дори и да се убедя в това все пак ми остава приятното усещане ,че това ще е най-любимото ми домашно казино.
Иначе напоследък някъде из този форум намериих интересна тема за търговия чрез фрактална вилица
Смотах няколко индикатора и най добрия леко го премодифицирах " да не му стърчат фракталите"

По доло го закачам комуто е интересно.
Няма да обяснявам как се търгува с него ще си погледнете из гугъло и сами ще се изучите

[code]
//+------------------------------------------------------------------+
//| mv-i-Chuvashov_1_1.mq4 |
//| Максим Василенко В. MaxV42 |
//| http:// |
//| Индикатор работает по стратегии "Вилка Чувашова". |
//| Версия 1.1: |
//| 29.11.2009 Добавлена отрисовка ордеров с алертами. |
//+------------------------------------------------------------------+
#property copyright "Максим Василенко В. MaxV42"
#property link "http://"
//+---------------------------------------------Black----Aqua----Snow---------+
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Black
#property indicator_color2 Black
#property indicator_width1 1
#property indicator_width2 1
//+------------------------------------------------------------------+
extern string Ind_Coment1= "--- Внешние параметры индикатора ---";
extern bool ShowFractals = true; // Вкл/выкл значков фракталов
extern bool OnAlert = false; // Вкл/выкл сигнала
extern bool OnPrint = false; // Вкл/выкл вывод сигнала в журнале эксперта
extern int nVilka.Upper = 1; // Количество выводимых восходящих "вилок"
extern int nVilka.Lower = 1; // Количество выводимых нисходящих "вилок"
extern color Color.LineUpper = Aqua; // Цвет восходящих "вилок"
extern color Color.LineLower = Snow; // Цвет нисходящих "вилок"
extern int Width.LineUpper = 2; // Ширина восходящих "вилок"
extern int Width.LineLower = 2; // Ширина нисходящих "вилок"
extern string Ind_Coment2= "--- Параметры отображения ордеров ---";
extern bool OnAlert.Orders = true; // Вкл/выкл сигнала
extern color Color.OrderBuy = Snow; // Цвет ордеров на покупку
extern color Color.OrderSell = Aqua; // Цвет ордеров на продажу
extern int Width.OrderBuy = 2; // Ширина ордеров на покупку
extern int Width.OrderSell = 2; // Ширина ордеров на продажу
extern color Color.SLBuy = Snow; // Цвет стоплосса на покупку
extern color Color.SLSell = Aqua; // Цвет стоплосса на продажу
extern int Orders.FontSize = 12; // Размер шрифта ордеров
//+------------------------------------------------------------------+
// глобальные переменные
int nLine.Upper = 0, // Количество трендовых линий, направленных вверх
nLine.Lower = 0, // Количество трендовых линий, направленных вниз
nBars = 0; //
datetime mLineUpper.DateTime[][2]; // массив с параметрами восходящих "вилок"
// mLineUpper.DateTime[i][0] // Время первой координаты
// mLineUpper.DateTime[i][1] // Время второй координаты
double mLineUpper.Price[][2]; // массив с параметрами восходящих "вилок"
// mLineUpper.Price[i][0] // Цена первой координаты
// mLineUpper.Price[i][1] // Цена второй координаты
datetime mLineLower.DateTime[][2]; // массив с параметрами нисходящих "вилок"
// mLineLower.DateTime[i][0] // Время первой координаты
// mLineLower.DateTime[i][1] // Время второй координаты
double mLineLower.Price[][2]; // массив с параметрами нисходящих "вилок"
// mLineLower.Price[i][0] // Цена первой координаты
// mLineLower.Price[i][1] // Цена второй координаты
int mOrders[2][1]; // массив с параметрами "открытых" позиций
// mOrders[0][0] // Buy - 0-нет ордера, 10-есть ордер
// mOrders[1][0] // Sell- 0-нет ордера, 20-есть ордер
//----- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
void init() { // Custom indicator initialization function
int Qnt=ObjectsTotal();
// ----- Indicators Properties
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,217);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,218);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(1,0.0);
// ----- Name for DataWindow and indicator subwindow label
IndicatorShortName("Fractals");
SetIndexLabel(0,"FractalsUp");
SetIndexLabel(1,"FractalsDown");
// ----- устанавливаем количество элементов в массивах трендовых линий
ArrayResize(mLineUpper.DateTime,nVilka.Upper*2); ArrayResize(mLineUpper.Price,nVilka.Upper*2);
ArrayResize(mLineLower.DateTime,nVilka.Lower*2); ArrayResize(mLineLower.Price,nVilka.Lower*2);
return;
}
//+------------------------------------------------------------------+
void deinit() { // Custom indicator deinitialization function
int Qnt=ObjectsTotal();
// ----- Удаляем трендовые линии
for (int i=0; i<Qnt; i++) { // Цикл по объектам
if(StringFind(ObjectName(i),"Line.Upper",0)>=0) {
ObjectDelete(ObjectName(i)); // направленные вверх
i--; continue;
}
if(StringFind(ObjectName(i),"Line.Lower",0)>=0) {
ObjectDelete(ObjectName(i)); // направленные вниз
i--; continue;
}
if(i>=ObjectsTotal()) break;
}
DeleteOrders(10); DeleteOrders(20);
return;
}
//+------------------------------------------------------------------+
void start() { // Custom indicator iteration function
int counted_bars=IndicatorCounted();
int limit;
int Spred=MarketInfo(Symbol(),MODE_SPREAD);
// новый бар не появился
if(!isNewBar()) return;
// ----- Последний посчитанный бар будет пересчитан
if (counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
// ----- Основной цикл
//for (int i=limit; i>2; i--) {
for (int i=limit; i>=0; i--) {
if(ShowFractals) { // отображаем bракталы на графике
ExtMapBuffer1[i]=iFractals(NULL,0,MODE_UPPER,i)+Spred*Point;
ExtMapBuffer2[i]=iFractals(NULL,0,MODE_LOWER,i)-Spred*Point;
}
//---- Блок Upper-фракталов (нисходящие "вилки")
if (iFractals(NULL,0,MODE_UPPER,i)!=0) {
if(LowerVilka(i)) {
if(OnAlert) Alert(Symbol(),Period()," Нисходящая вилка! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
if(OnPrint) Print(Symbol(),Period()," Нисходящая вилка! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
}
}
//---- Блок Lower-фракталов (восходящие "вилки")
if (iFractals(NULL,0,MODE_LOWER,i)!=0) {
if(UpperVilka(i)) {
if(OnAlert) Alert(Symbol(),Period()," Восходящая вилка! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
if(OnPrint) Print(Symbol(),Period()," Восходящая вилка! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
}
}
//----- пересечение нисходящей "вилки" - сигнал на покупку
if(mOrders[0][0]==0 && (Close[i+1]>ObjectGetValueByShift("Line.Lower1",i+1) ||
Open[i]>ObjectGetValueByShift("Line.Lower1",i))) {
DrawOrdersBuy(i);
if(OnAlert.Orders) {
//Alert(Symbol(),Period(),": Сигнал на покупку! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
}
}
//----- пересечение восходящей "вилки" - сигнал на продажу
if(mOrders[1][0]==0 && (Close[i+1]<ObjectGetValueByShift("Line.Upper1",i+1) ||
Open[i]<ObjectGetValueByShift("Line.Upper1",i))) {
DrawOrdersSell(i);
if(OnAlert.Orders) {
// Alert(Symbol(),Period(),": Сигнал на продажу! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
}
}
}
return;
}
//+-------- // Функция определяет и рисует восходящие "вилки"----------------------------------------------------------+
bool UpperVilka(int nBar) {
int j=0;
double Fractal.Lower=0;
double mFractals.Price[3];
datetime mFractals.DateTime[3];
// ----- заполняем массивы информацией о последних трех фракталах
ArrayInitialize(mFractals.Price,0); ArrayInitialize(mFractals.DateTime,0);
for (int i=nBar; i<Bars; i++) { // Цикл по барам
Fractal.Lower=iFractals(NULL,0,MODE_LOWER,i);
if(Fractal.Lower!=0) {
mFractals.Price[j]=Fractal.Lower-MarketInfo(Symbol(),MODE_SPREAD)*Point;
mFractals.DateTime[j]=Time[i];
j++;
}
if(j>2) break;
}
// ----- рисуем восходящую "вилку"
if(mFractals.Price[2]<mFractals.Price[1] && mFractals.Price[1]<mFractals.Price[0]) {
string Name1="Line.Upper"+DoubleToStr(nLine.Upper,0); nLine.Upper++;
string Name2="Line.Upper"+DoubleToStr(nLine.Upper,0); nLine.Upper++;
ObjectCreate(Name1,OBJ_TREND,0,mFractals.DateTime[2],mFractals.Price[2],mFractals.DateTime[1],mFractals.Price[1]);
ObjectCreate(Name2,OBJ_TREND,0,mFractals.DateTime[1],mFractals.Price[1],mFractals.DateTime[0],mFractals.Price[0]);
if (ObjectGetValueByShift(Name1,nBar)<ObjectGetValueB yShift(Name2,nBar)) {
ObjectDelete(Name1); ObjectDelete(Name2); nLine.Upper--; nLine.Upper--; return(false);
}
ObjectSet(Name1,OBJPROP_COLOR,Color.LineUpper); ObjectSet(Name2,OBJPROP_COLOR,Color.LineUpper);
ObjectSet(Name1,OBJPROP_WIDTH,Width.LineUpper); ObjectSet(Name2,OBJPROP_WIDTH,Width.LineUpper);
ObjectSet(Name1,OBJPROP_RAY,True); ObjectSet(Name2,OBJPROP_RAY,True);
CheckNumVilka(10);
// ----- снимаем флаг "открытого" ордера на продажу
mOrders[1][0]=0;
// ----- удаляем предыдущий ордер на продажу
DeleteOrders(20);
return(true);
}
return(false);
}
//+---------- // Функция определяет и рисует нисходящие "вилки"------------------+
bool LowerVilka(int nBar) {
int j=0;
double Fractal.Upper=0;
double mFractals.Price[3];
datetime mFractals.DateTime[3];
// ----- заполняем массивы информацией о последних трех фракталах
ArrayInitialize(mFractals.Price,0); ArrayInitialize(mFractals.DateTime,0);
for (int i=nBar; i<Bars; i++) { // Цикл по барам
Fractal.Upper=iFractals(NULL,0,MODE_UPPER,i);
if(Fractal.Upper!=0) {
mFractals.Price[j]=Fractal.Upper+MarketInfo(Symbol(),MODE_SPREAD)*Po int;
mFractals.DateTime[j]=Time[i];
j++;
}
if(j>2) break;
}
// ----- рисуем нисходящие "вилку"
if(mFractals.Price[2]>mFractals.Price[1] && mFractals.Price[1]>mFractals.Price[0]) {
string Name1="Line.Lower"+DoubleToStr(nLine.Lower,0); nLine.Lower++;
string Name2="Line.Lower"+DoubleToStr(nLine.Lower,0); nLine.Lower++;
ObjectCreate(Name1,OBJ_TREND,0,mFractals.DateTime[2],mFractals.Price[2],mFractals.DateTime[1],mFractals.Price[1]);
ObjectCreate(Name2,OBJ_TREND,0,mFractals.DateTime[1],mFractals.Price[1],mFractals.DateTime[0],mFractals.Price[0]);
if (ObjectGetValueByShift(Name1,nBar)>ObjectGetValueB yShift(Name2,nBar)) {
ObjectDelete(Name1); ObjectDelete(Name2); nLine.Lower--; nLine.Lower--; return(false);
}
ObjectSet(Name1,OBJPROP_COLOR,Color.LineLower); ObjectSet(Name2,OBJPROP_COLOR,Color.LineLower);
ObjectSet(Name1,OBJPROP_WIDTH,Width.LineLower); ObjectSet(Name2,OBJPROP_WIDTH,Width.LineLower);
ObjectSet(Name1,OBJPROP_RAY,True); ObjectSet(Name2,OBJPROP_RAY,True);
CheckNumVilka(20);
// ----- снимаем флаг "открытого" ордера на покупку
mOrders[0][0]=0;
// ----- удаляем предыдущий ордер на покупку
DeleteOrders(10);
return(true);
}
return(false);
}
//+--// Функция возвращает true, если появиться новый бар, иначе false
bool isNewBar() {
if(nBars!=Bars) {
nBars=Bars; return(true);
}
return(false);
}
// Функция проверяет допустимое количество вилок указанного типа
int i;
void CheckNumVilka(int Type) {
switch(Type) {
case 10:
//--------------------------------------------------------- 1 --
if(nLine.Upper<=nVilka.Upper*2) {
mLineUpper.DateTime[nLine.Upper-2][0]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_TIME1);
mLineUpper.DateTime[nLine.Upper-2][1]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_TIME2);
mLineUpper.Price[nLine.Upper-2][0]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_PRICE1);
mLineUpper.Price[nLine.Upper-2][1]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_PRICE2);
//+------------------------------------------------------------------+
mLineUpper.DateTime[nLine.Upper-1][0]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_TIME1);
mLineUpper.DateTime[nLine.Upper-1][1]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_TIME2);
mLineUpper.Price[nLine.Upper-1][0]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_PRICE1);
mLineUpper.Price[nLine.Upper-1][1]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_PRICE2);
}
//--------------------------------------------------------- 2 --
if(nLine.Upper >nVilka.Upper*2) {
for (i=0; i<nLine.Upper-4; i++) {
mLineUpper.DateTime[i][0]=mLineUpper.DateTime[i+2][0]; mLineUpper.DateTime[i][1]=mLineUpper.DateTime[i+2][1];
mLineUpper.Price[i][0]=mLineUpper.Price[i+2][0]; mLineUpper.Price[i][1]=mLineUpper.Price[i+2][1];
}
mLineUpper.DateTime[nLine.Upper-4][0]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_TIME1);
mLineUpper.DateTime[nLine.Upper-4][1]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_TIME2);
mLineUpper.Price[nLine.Upper-4][0]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_PRICE1);
mLineUpper.Price[nLine.Upper-4][1]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_PRICE2);
//+------------------------------------------------------------------+
mLineUpper.DateTime[nLine.Upper-3][0]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_TIME1);
mLineUpper.DateTime[nLine.Upper-3][1]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_TIME2);
mLineUpper.Price[nLine.Upper-3][0]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_PRICE1);
mLineUpper.Price[nLine.Upper-3][1]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_PRICE2);
//+------------------------------------------------------------------+
ObjectDelete("Line.Upper"+(nLine.Upper-2)); ObjectDelete("Line.Upper"+(nLine.Upper-1));
nLine.Upper--;nLine.Upper--;
//+------------------------------------------------------------------+
for (i=0; i<nLine.Upper; i++) {
ObjectMove("Line.Upper"+i,0,mLineUpper.DateTime[i][0],mLineUpper.Price[i][0]);
ObjectMove("Line.Upper"+i,1,mLineUpper.DateTime[i][1],mLineUpper.Price[i][1]);
}
}
break; // это добавил после внимательного прочтения справки
case 20:
//--------------------------------------------------------- 1 --
if(nLine.Lower<=nVilka.Lower*2) {
mLineLower.DateTime[nLine.Lower-2][0]=ObjectGet("Line.Lower"+(nLine.Lower-2),OBJPROP_TIME1);
mLineLower.DateTime[nLine.Lower-2][1]=ObjectGet("Line.Lower"+(nLine.Lower-2),OBJPROP_TIME2);
mLineLower.Price[nLine.Lower-2][0]=ObjectGet("Line.Lower"+(nLine.Lower-2),OBJPROP_PRICE1);
mLineLower.Price[nLine.Lower-2][1]=ObjectGet("Line.Lower"+(nLine.Lower-2),OBJPROP_PRICE2);
//+------------------------------------------------------------------+
mLineLower.DateTime[nLine.Lower-1][0]=ObjectGet("Line.Lower"+(nLine.Lower-1),OBJPROP_TIME1);
mLineLower.DateTime[nLine.Lower-1][1]=ObjectGet("Line.Lower"+(nLine.Lower-1),OBJPROP_TIME2);
mLineLower.Price[nLine.Lower-1][0]=ObjectGet("Line.Lower"+(nLine.Lower-1),OBJPROP_PRICE1);
mLineLower.Price[nLine.Lower-1][1]=ObjectGet("Line.Lower"+(nLine.Lower-1),OBJPROP_PRICE2);
}
//--------------------------------------------------------- 2 --
if(nLine.Lower >nVilka.Lower*2) {
for (i=0; i<nLine.Lower-4; i++) {
mLineLower.DateTime[i][0]=mLineLower.DateTime[i+2][0]; mLineLower.DateTime[i][1]=mLineLower.DateTime[i+2][1];
mLineLower.Price[i][0]=mLineLower.Price[i+2][0]; mLineLower.Price[i][1]=mLineLower.Price[i+2][1];
}
mLineLower.DateTime[nLine.Lower-4][0]=ObjectGet("Line.Lower"+(nLine.Lower-2),OBJPROP_TIME1);
mLineLower.DateTime[nLine.Lower-4][1]=ObjectGet("Line.Lower"+(nLine.Lower-2),OBJPROP_TIME2);
mLineLower.Price[nLine.Lower-4][0]=ObjectGet("Line.Lower"+(nLine.Lower-2),OBJPROP_PRICE1);
mLineLower.Price[nLine.Lower-4][1]=ObjectGet("Line.Lower"+(nLine.Lower-2),OBJPROP_PRICE2);
//+------------------------------------------------------------------+
mLineLower.DateTime[nLine.Lower-3][0]=ObjectGet("Line.Lower"+(nLine.Lower-1),OBJPROP_TIME1);
mLineLower.DateTime[nLine.Lower-3][1]=ObjectGet("Line.Lower"+(nLine.Lower-1),OBJPROP_TIME2);
mLineLower.Price[nLine.Lower-3][0]=ObjectGet("Line.Lower"+(nLine.Lower-1),OBJPROP_PRICE1);
mLineLower.Price[nLine.Lower-3][1]=ObjectGet("Line.Lower"+(nLine.Lower-1),OBJPROP_PRICE2);
//+------------------------------------------------------------------+
ObjectDelete("Line.Lower"+(nLine.Lower-2)); ObjectDelete("Line.Lower"+(nLine.Lower-1));
nLine.Lower--;nLine.Lower--;
//+------------------------------------------------------------------+
for (i=0; i<nLine.Lower; i++) {
ObjectMove("Line.Lower"+i,0,mLineLower.DateTime[i][0],mLineLower.Price[i][0]);
ObjectMove("Line.Lower"+i,1,mLineLower.DateTime[i][1],mLineLower.Price[i][1]);
}
}
break; // это добавил после внимательного прочтения справки
}
return;
}
//+------------------------------------------------------------------+
void DeleteOrders(int Type) { // Функция удаляет ордера указанного типа
if(Type==10) {
//--------------------------------------------------------- 1 --
ObjectDelete("Order.Buy"); ObjectDelete("OrderArrow.Buy");
ObjectDelete("StopLoss.Buy"); ObjectDelete("StopLossArrow.Buy");
ObjectDelete("LabelPrice.Buy"); ObjectDelete("LabelStopLoss.Buy");
}
if(Type==20) {
//--------------------------------------------------------- 2 --
ObjectDelete("Order.Sell"); ObjectDelete("OrderArrow.Sell");
ObjectDelete("StopLoss.Sell"); ObjectDelete("StopLossArrow.Sell");
ObjectDelete("LabelPrice.Sell"); ObjectDelete("LabelStopLoss.Sell");
}
/* Не мог понять, почему выполняются оба оператора при вызове функции с параметром Type=10 пока не прочитал это:
Ключевое слово case вместе с константой служат просто метками, и если будут выполняться операторы
для некоторого варианта case, то далее будут выполняться операторы всех последующих вариантов до тех пор,
пока не встретится оператор break, что позволяет связывать одну последовательность операторов с несколькими вариантами
*/
/* Я раньше писал на VB6 там выполняется только один оператор - для которого совпадает метка!
*/
/*
switch(Type) {
case 10:
//--------------------------------------------------------- 1 --
ObjectDelete("Order.Buy"); ObjectDelete("OrderArrow.Buy");
ObjectDelete("StopLoss.Buy"); ObjectDelete("StopLossArrow.Buy");
ObjectDelete("LabelPrice.Buy"); ObjectDelete("LabelStopLoss.Buy");
break; // это добавил после внимательного прочтения справки
case 20:
//--------------------------------------------------------- 2 --
ObjectDelete("Order.Sell"); ObjectDelete("OrderArrow.Sell");
ObjectDelete("StopLoss.Sell"); ObjectDelete("StopLossArrow.Sell");
ObjectDelete("LabelPrice.Sell"); ObjectDelete("LabelStopLoss.Sell");
break; // это добавил после внимательного прочтения справки
}
*/
return;
}
//+------------------------------------------------------------------+
void DrawOrdersBuy(int nBar) { // Функция рисут ордера Buy
double Price.Buy=Open[nBar];
double StopLoss.Buy;
// ----- удаляем предыдущий ордер на покупку
DeleteOrders(10);
// ----- рисуем ордер на покупку
ObjectCreate("Order.Buy",OBJ_TREND,0,Time[nBar+25],Price.Buy,Time[nBar],Price.Buy);
ObjectCreate("OrderArrow.Buy",OBJ_ARROW,0,Time[nBar+23],Price.Buy);
ObjectSet("Order.Buy",OBJPROP_COLOR,Color.OrderBuy ); ObjectSet("OrderArrow.Buy",OBJPROP_COLOR,Color.Ord erBuy);
ObjectSet("Order.Buy",OBJPROP_WIDTH,Width.OrderBuy ); ObjectSet("OrderArrow.Buy",OBJPROP_WIDTH,Width.Ord erBuy);
ObjectSet("Order.Buy",OBJPROP_RAY,false); ObjectSet("OrderArrow.Buy",OBJPROP_ARROWCODE,225);
ObjectCreate("LabelPrice.Buy",OBJ_TEXT,0,Time[nBar+10],Price.Buy);
ObjectSetText("LabelPrice.Buy","Buy: "+DoubleToStr(Price.Buy,Digits),Orders.FontSiz e, "Times New Roman",
Color.OrderBuy);
// ----- рисуем стоплос на покупку
for (int i=nBar; i<Bars; i++) { // Цикл по барам
StopLoss.Buy=iFractals(NULL,0,MODE_LOWER,i);
if(StopLoss.Buy!=0) {
StopLoss.Buy=StopLoss.Buy-MarketInfo(Symbol(),MODE_SPREAD)*Point;
break;
}
}
ObjectCreate("StopLoss.Buy",OBJ_TREND,0,Time[nBar+25],StopLoss.Buy,Time[nBar],StopLoss.Buy);
ObjectCreate("StopLossArrow.Buy",OBJ_ARROW,0,Time[nBar+23],StopLoss.Buy);
ObjectSet("StopLoss.Buy",OBJPROP_COLOR,Color.SLBuy ); ObjectSet("StopLossArrow.Buy",OBJPROP_COLOR,Color. SLBuy);
ObjectSet("StopLoss.Buy",OBJPROP_WIDTH,Width.Order Buy); ObjectSet("StopLossArrow.Buy",OBJPROP_WIDTH,Width. OrderBuy);
ObjectSet("StopLoss.Buy",OBJPROP_RAY,false); ObjectSet("StopLossArrow.Buy",OBJPROP_ARROWCODE,25 1);
ObjectCreate("LabelStopLoss.Buy",OBJ_TEXT,0,Time[nBar+10],StopLoss.Buy);
ObjectSetText("LabelStopLoss.Buy","SL Buy: "+DoubleToStr(StopLoss.Buy,Digits),Orders.FontSize , "Times New Roman",
Color.SLBuy);
// ----- устанавливаем флаг "открытого" ордера на покупку
mOrders[0][0]=10;
return;
}
//+------------------------------------------------------------------+
void DrawOrdersSell(int nBar) { // Функция рисут ордера Sell
double Price.Sell=Open[nBar];
double StopLoss.Sell;
// ----- удаляем предыдущий ордер на продажу
DeleteOrders(20);
// ----- рисуем ордер на продажу
ObjectCreate("Order.Sell",OBJ_TREND,0,Time[nBar+25],Price.Sell,Time[nBar],Price.Sell);
ObjectCreate("OrderArrow.Sell",OBJ_ARROW,0,Time[nBar+23],Price.Sell+10*Point);
ObjectSet("Order.Sell",OBJPROP_COLOR,Color.OrderSe ll); ObjectSet("OrderArrow.Sell",OBJPROP_COLOR,Color.Or derSell);
ObjectSet("Order.Sell",OBJPROP_WIDTH,Width.OrderSe ll); ObjectSet("OrderArrow.Sell",OBJPROP_WIDTH,Width.Or derSell);
ObjectSet("Order.Sell",OBJPROP_RAY,false); ObjectSet("OrderArrow.Sell",OBJPROP_ARROWCODE,226) ;
ObjectCreate("LabelPrice.Sell",OBJ_TEXT,0,Time[nBar+10],Price.Sell+10*Point);
ObjectSetText("LabelPrice.Sell","Sell: "+DoubleToStr(Price.Sell,Digits),Orders.FontSi ze, "Times New Roman",
Color.OrderSell);
// ----- рисуем стоплос на продажу
for (int i=nBar; i<Bars; i++) { // Цикл по барам
StopLoss.Sell=iFractals(NULL,0,MODE_UPPER,i);
if(StopLoss.Sell!=0) {
StopLoss.Sell=StopLoss.Sell+MarketInfo(Symbol(),MO DE_SPREAD)*Point;
break;
}
}
ObjectCreate("StopLoss.Sell",OBJ_TREND,0,Time[nBar+25],StopLoss.Sell,Time[nBar],StopLoss.Sell);
ObjectCreate("StopLossArrow.Sell",OBJ_ARROW,0,Time[nBar+23],StopLoss.Sell+10*Point);
ObjectSet("StopLoss.Sell",OBJPROP_COLOR,Color.SLSe ll); ObjectSet("StopLossArrow.Sell",OBJPROP_COLOR,Color .SLSell);
ObjectSet("StopLoss.Sell",OBJPROP_WIDTH,Width.Orde rSell);ObjectSet("StopLossArrow.Sell",OBJPROP_WIDT H,Width.OrderSell);
ObjectSet("StopLoss.Sell",OBJPROP_RAY,false); ObjectSet("StopLossArrow.Sell",OBJPROP_ARROWCODE,2 51);
ObjectCreate("LabelStopLoss.Sell",OBJ_TEXT,0,Time[nBar+10],StopLoss.Sell+10*Point);
ObjectSetText("LabelStopLoss.Sell","SL Sell: "+DoubleToStr(StopLoss.Sell,Digits),Orders.FontSiz e, "Times New Roman",
Color.SLSell);
// ----- устанавливаем флаг "открытого" ордера на продажу
mOrders[1][0]=20;
return;}
//================================================== ======
[/code]
Коментар