#samewindow
#line 0 solid blue
//------------------------------------------------------------------------------------
static m;
static stz;
static pr;
static op;
var x;
var y;
//------------------------------------------------------------------------------------
function init() {
x = new_object("hash");
y = new_object("hash");
}
//------------------------------------------------------------------------------------
function onOrder(var id) {
x = getOrder(id);
stz = x["status"]; // Запоминаем статус заявки
}
function onTrade(var id) {
y = getTrade(id);
op = y["operation"]; // Запоминаем направление сделки
pr = y["price"]; // Запоминаем цену сделки
}
//------------------------------------------------------------------------------------
function calc() {
if (m == 0) {trade_action::sell(1, ::lots); }
if (op == -1) {m = 1;} // где op = y["operation"]; переменная из хэша, что сделка на продажу прошла
line[0] = MovAvg(ind_ema, 5, pt_close);
}
Когда скрипт запускаю в окне графика, происходит продажа 1 лота и все, дальше сделок нет. Так было и задумано.

Если запускаю этот скрипт в тестере стратегий на исторических данных он мне рисует вот такую картину

Ответ: На протяжении всей работы скрипта m=0; соответственно до второй скобки компилятор даже не добирается (чтобы сделать m = 1), если бы в первых скобках стояла мультиплай версия продажи - то он бы шмалял продажи по каждому тику.
Так как там не мультиплай - делает продажу на каждую свечку по одному разу.
В целом условие которое вы ждете if (op == -1) где op = y["operation"]; может и наступать,...но не сработает во-первых из вышеизложенного, и во-вторых - в переменную же сохраняется стринг в виде константы "OP_SELL" - а не число, равное -1
Поэтому самое целесообразное, для такого минутного торга, сделать так :
function calc() {
if (op == "OP_SELL") {m = 1;}
if (m == 0) {trade_action::sell(1, ::lots); }
line[0] = MovAvg(ind_ema, 5, pt_close);
}