Как кодировать? - страница 324

 
mladen:
Не так просто объяснить

Вы должны послать событие на автономный график, которое "скажет" ему (из вашего индикатора), что сгенерирован новый тик и что он должен выполнить необходимые процедуры. Это означает использование функций низкого уровня. Все это может выглядеть примерно так:

#include

#import "user32.dll"

int GetParent(int hWnd);

#import

#define CHART_CMD_UPDATE_DATA 33324

void UpdateChartWindows()

{

int filePeriod = 1; // file period

string fileSymbol = "your offline symbol name";

string chartName = "your offline symbol chart full name";

string stringForName = " ";

//

//

//

//

//

int windowHandle = WindowHandle(fileSymbol,filePeriod);

if (windowHandle != 0)

{

windowHandle = GetParent(windowHandle);

windowHandle = GetWindow(windowHandle,GW_HWNDFIRST);

while (windowHandle != 0)

{

int len = GetWindowTextA(windowHandle,stringForName,80);

if (len > 0 && StringSubstr(stringForName,0,len) == chartName)

PostMessageA(windowHandle,WM_COMMAND,CHART_CMD_UPDATE_DATA,0);

windowHandle = GetWindow(windowHandle,GW_HWNDNEXT);

}

}

}

Спасибо, я проверю это. Однако я нахожу проблему для корректного sendorder. Мой индикатор создает нестандартное имя для автономного графика, и платформы не открывают его по этой причине.

Спасибо за вашу отзывчивость

 

Хорошо, проблема для автономного графика в работе.

У меня есть другая проблема.

Мне нужно создать индикатор, который рассчитывает объемы по определенным правилам.

Мне нужно, чтобы при каждом колебании тика индикатор считал длину колебания.

Пример.

На свече Open буфер значений равен 0. Значит, он должен считать все тики, сделанные до ретрейсмента, но конечное возвращаемое значение будет наибольшим из них с момента закрытия свечи.

После этого он должен установить цвет гистограммы, отражающей движение, совершенное в самом высоком диапазоне, возвращенном из буфера.

Пробую разными способами, но безрезультатно.

Помогите ^^.

Спасибо

 

Спасибо за всю вашу поддержку. Я узнаю больше и с вашей помощью я исправляю все свои просьбы... НО.

У меня есть еще один^^.

Мне нужно создать функцию void для вызова и она должна быть объединением этих двух кодов.

Первый находит последний открытый ордер, а второй находит количество открытых ордеров, у которых цена открытия выше.

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

Спасибо

for(int i = OrdersTotal()-1; i>= 0; i--) {

OrderSelect(i, SELECT_BY_POS);

if(OrderSymbol() == Symbol() && OrderType() == TYPE ) {

if(TYPE == OP_BUY) {

double OPrice = OrderOpenPrice();[/PHP]

[PHP]for(int e=0;e<OrdersTotal();e++) {

if(OrderSelect(e,SELECT_BY_POS,MODE_TRADES)==false ) break;

if(OrderSymbol() == Symbol() && OrderType() == TYPE) {

if(TYPE == OP_BUY) {

if(OrderOpenPrice()>test(OP_BUY) Hbuys++;

}

}

}

return(Hbuys);

}

 
dasio:
Спасибо за вашу поддержку. Я узнаю больше, и с вашей помощью я исправил все свои просьбы... НО.

У меня есть еще одна^^.

Мне нужно создать функцию void для вызова и она должна быть объединением этих двух кодов.

Первый находит последний открытый ордер, а второй находит количество открытых ордеров, у которых цена открытия выше.

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

Спасибо

for(int i = OrdersTotal()-1; i>= 0; i--) {

OrderSelect(i, SELECT_BY_POS);

if(OrderSymbol() == Symbol() && OrderType() == TYPE ) {

if(TYPE == OP_BUY) {

double OPrice = OrderOpenPrice();[/PHP]

for(int e=0;e<OrdersTotal();e++) {

if(OrderSelect(e,SELECT_BY_POS,MODE_TRADES)==false ) break;

if(OrderSymbol() == Symbol() && OrderType() == TYPE) {

if(TYPE == OP_BUY) {

if(OrderOpenPrice()>test(OP_BUY) Hbuys++;

}

}

}

return(Hbuys);

}

У меня ошибка во втором коде. Он правильный

[PHP]for(int e=0;e<OrdersTotal();e++) {

if(OrderSelect(e,SELECT_BY_POS,MODE_TRADES)==false ) break;

if(OrderSymbol() == Symbol() && OrderType() == TYPE) {

if(TYPE == OP_BUY) {

if(OrderOpenPrice()>OPrice Hbuys++;

}

}

}

return(Hbuys);

}

 

dasio

Функция void - это функция, которая не возвращает никакого значения. Если это так, то единственный разумный способ сделать это - использовать некоторую переменную, которая будет передаваться по ссылке в функцию (по моему опыту, использование переменных глобальной области видимости для этой цели является очень плохой практикой - это позволяет избежать структурированных правил кодирования, а в случаях, когда нужно искать ошибку, использование таких переменных становится кошмаром). Это то, что вы имели в виду?

dasio:
Я допустил ошибку во втором коде. Это правильно
for(int e=0;e<OrdersTotal();e++) {

if(OrderSelect(e,SELECT_BY_POS,MODE_TRADES)==false ) break;

if(OrderSymbol() == Symbol() && OrderType() == TYPE) {

if(TYPE == OP_BUY) {

if(OrderOpenPrice()>OPrice Hbuys++;

}

}

}

return(Hbuys);

}

 
mladen:
dasio void функция - это функция, которая не возвращает никакого значения. Если это так, то единственный разумный способ сделать это - использовать некоторую переменную, которая будет передаваться по ссылке в функцию (по моему опыту, использование переменных глобальной области видимости для этой цели является очень плохой практикой - это позволяет избежать структурированных правил кодирования, а в случаях, когда нужно искать ошибку, использование таких переменных становится кошмаром). Это то, что вы имели в виду?

Спасибо за ваш ответ,

Мне нужно только количество покупок, которые имеют самый высокий openorder и самый низкий openorderm относительно последнего открытого ордера на покупку.

Я должен использовать результат как moltiplier в функции vois для некоторой проверки.

Так намного проще вызвать эту запись при запросе. Может быть, таким образом, я могу вызвать его просто CalculateCurrentBuy(Symbol()).

int CalculateHighestbuy(string symbol) {

int Hopen=0;

for(int i=0;i<OrdersTotal();i++) {

code here

}

}

return(Hopen);

}

 

сетка трейлинга?

for(int i = 1; i < Stop.Order.Levels+1; i++)

{

if(Set.SELLSTOP && s.ticketP==0){

OrderSend(Symbol(),OP_SELLSTOP,Sell.Lots+i*Sell.Multiplier,Ask-i*(Trail.SELLSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

if(Set.BUYSTOP && b.ticketP==0){

OrderSend(Symbol(),OP_BUYSTOP,Buy.Lots+i*Buy.Multiplier,Bid+i*(Trail.BUYSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

}[/CODE]

I can set a grid using the above code but how do I get the Buy Grid and Sell grid grid to trail independently or as a set and retain the separate grid spacing? I have tried all sorts of things and must be missing something obvious. All I get is either all the pending orders move to the same level and then trail as a group or the pending orders start moving up and down with the price action.

[CODE] void TrailingOrders() {

if (Trail.BUYSTOP.Orders && OrderType()==OP_BUYSTOP) {

if (OrderOpenPrice()-Ask>(Trail.BUYSTOP.Orders.Distance)*myPoint) {

OrderModify(OrderTicket(),Ask+OrderOpenPrice()+(Trail.BUYSTOP.Orders.Distance)*myPoint,OrderStopLoss(),OrderTakeProfit(), 0, Aqua);

}

}

if (Trail.SELLSTOP.Orders && OrderType()==OP_SELLSTOP) {

if (Bid-OrderOpenPrice()>(Trail.SELLSTOP.Orders.Distance)*myPoint) {

OrderModify(OrderTicket(),Bid-OrderOpenPrice()-(Trail.SELLSTOP.Orders.Distance)*myPoint,OrderStopLoss(),OrderTakeProfit(), 0, Yellow);

}

}

}

Этот код отслеживает 2 ордера, но как я могу изменить его, чтобы отслеживать больше? Как только я пытаюсь настроить код трейлинга для нескольких уровней, как в приведенном выше коде сетки, он превращается в заварной крем.

Буду признателен за любую подсказку.

С уважением, CJA

 

...

cja

Я попробовал со следующим кодом, и он работает нормально (см. пример картинки: разные шаги уже применены).

Не знал, для чего нужны переменные s.ticketP и b.ticketP, поэтому использовал их так, как показано в коде.

extern double Trail.SELLSTOP.Orders.Distance = 15;

extern double Trail.BUYSTOP.Orders.Distance = 20;

extern int Stop.Order.Levels = 4;

extern double Sell.Lots = 0.1;

extern double Sell.Multiplier = 0.1;

extern double Buy.Lots = 0.1;

extern double Buy.Multiplier = 0.2;

extern bool Set.SELLSTOP = true;

extern bool Set.BUYSTOP = true;

int init()

{

return(0);

}

int start()

{

double myPoint=1; if (Digits==3 || Digits==5) myPoint=10; myPoint *= Point;

static int s.ticketP=0;

static int b.ticketP=0;

for(int i = 1; i < Stop.Order.Levels+1; i++)

{

if(Set.SELLSTOP && s.ticketP==0){ OrderSend(Symbol(),OP_SELLSTOP,Sell.Lots+i*Sell.Multiplier,Bid-i*(Trail.SELLSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

if(Set.BUYSTOP && b.ticketP==0){ OrderSend(Symbol(),OP_BUYSTOP ,Buy.Lots+i *Buy.Multiplier ,Ask+i*(Trail.BUYSTOP.Orders.Distance)*myPoint ,0,0,0,0,0,0,CLR_NONE);}

}

s.ticketP=Stop.Order.Levels;

b.ticketP=Stop.Order.Levels;

return(0);

}

cja:
for(int i = 1; i < Stop.Order.Levels+1; i++)

{

if(Set.SELLSTOP && s.ticketP==0){

OrderSend(Symbol(),OP_SELLSTOP,Sell.Lots+i*Sell.Multiplier,Ask-i*(Trail.SELLSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

if(Set.BUYSTOP && b.ticketP==0){

OrderSend(Symbol(),OP_BUYSTOP,Buy.Lots+i*Buy.Multiplier,Bid+i*(Trail.BUYSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

}[/CODE]

I can set a grid using the above code but how do I get the Buy Grid and Sell grid grid to trail independently or as a set and retain the separate grid spacing? I have tried all sorts of things and must be missing something obvious. All I get is either all the pending orders move to the same level and then trail as a group or the pending orders start moving up and down with the price action.

[CODE] void TrailingOrders() {

if (Trail.BUYSTOP.Orders && OrderType()==OP_BUYSTOP) {

if (OrderOpenPrice()-Ask>(Trail.BUYSTOP.Orders.Distance)*myPoint) {

OrderModify(OrderTicket(),Ask+OrderOpenPrice()+(Trail.BUYSTOP.Orders.Distance)*myPoint,OrderStopLoss(),OrderTakeProfit(), 0, Aqua);

}

}

if (Trail.SELLSTOP.Orders && OrderType()==OP_SELLSTOP) {

if (Bid-OrderOpenPrice()>(Trail.SELLSTOP.Orders.Distance)*myPoint) {

OrderModify(OrderTicket(),Bid-OrderOpenPrice()-(Trail.SELLSTOP.Orders.Distance)*myPoint,OrderStopLoss(),OrderTakeProfit(), 0, Yellow);

}

}

}

Этот код отслеживает 2 заказа, но как я могу изменить его, чтобы отслеживать больше? Как только я пытаюсь установить код отслеживания для нескольких уровней, как в коде grid выше, он превращается в крем.

Буду признателен за любую подсказку.

С уважением, CJA
Файлы:
stopd.gif  36 kb
 

Трейлинг-сетка

mladen:
cja

Я попробовал со следующим кодом, и он работает нормально (см. пример картинки: разные шаги уже применены).

Не знал, для чего нужны переменные s.ticketP и b.ticketP, поэтому использовал их так, как показано в коде.

extern double Trail.SELLSTOP.Orders.Distance = 15;

extern double Trail.BUYSTOP.Orders.Distance = 20;

extern int Stop.Order.Levels = 4;

extern double Sell.Lots = 0.1;

extern double Sell.Multiplier = 0.1;

extern double Buy.Lots = 0.1;

extern double Buy.Multiplier = 0.2;

extern bool Set.SELLSTOP = true;

extern bool Set.BUYSTOP = true;

int init()

{

return(0);

}

int start()

{

double myPoint=1; if (Digits==3 || Digits==5) myPoint=10; myPoint *= Point;

static int s.ticketP=0;

static int b.ticketP=0;

for(int i = 1; i < Stop.Order.Levels+1; i++)

{

if(Set.SELLSTOP && s.ticketP==0){ OrderSend(Symbol(),OP_SELLSTOP,Sell.Lots+i*Sell.Multiplier,Bid-i*(Trail.SELLSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

if(Set.BUYSTOP && b.ticketP==0){ OrderSend(Symbol(),OP_BUYSTOP ,Buy.Lots+i *Buy.Multiplier ,Ask+i*(Trail.BUYSTOP.Orders.Distance)*myPoint ,0,0,0,0,0,0,CLR_NONE);}

}

s.ticketP=Stop.Order.Levels;

b.ticketP=Stop.Order.Levels;

return(0);

}

Привет, Младен,

Спасибо за помощь, однако, возможно, я не совсем ясно выразился в своем сообщении выше. У меня нет проблем с установкой сетки, проблема в том, что я не теряю разделение заказов.

s.ticketP и b.ticketP просто относятся к коду отложенных ордеров BUYSTOP и SELLSTOP, используемых в других частях советника.

С уважением, CJA

 

Трейлинг-сетка

cja:
Привет, mladen,

Спасибо за помощь, однако, возможно, я не совсем ясно выразился в своем сообщении выше. У меня нет проблем с установкой сетки, проблема в том, чтобы отследить сетку без потери разделения ордеров.

s.ticketP и b.ticketP просто относятся к коду отложенных ордеров BUYSTOP и SELLSTOP, используемых в других частях советника.

С уважением, CJA

Привет, Младен,

Есть время взглянуть на это?

С уважением, CJA